From 550f4fbcdcd3058f3e130165dd2d19bba277f5e0 Mon Sep 17 00:00:00 2001 From: Edison Su Date: Tue, 20 Nov 2012 18:56:51 -0800 Subject: [PATCH] create template/primary data store is done --- developer/pom.xml | 1 + .../engine/cloud/entity/api/VolumeEntity.java | 1 + .../storage/StorageOrchestratorImpl.java | 13 ++- .../DefaultPrimaryDataStoreImpl.java | 13 +-- .../datastore/db/PrimaryDataStoreDao.java | 30 ++--- .../datastore/db/PrimaryDataStoreDaoImpl.java | 80 ++++++------- .../db/PrimaryDataStoreProviderDao.java | 2 +- .../db/PrimaryDataStoreProviderDaoImpl.java | 10 ++ .../db/PrimaryDataStoreProviderVO.java | 13 ++- ...taStoreVO.java => PrimaryDataStoreVO.java} | 39 ++++--- .../DefaultPrimaryDataStoreLifeCycleImpl.java | 69 ++++++++++- .../lifecycle/PrimaryDataStoreLifeCycle.java | 4 +- .../DefaultPrimaryDataStoreManagerImpl.java | 4 +- .../DefaultPrimaryDatastoreProviderImpl.java | 49 +++++++- .../provider/PrimaryDataStoreProvider.java | 10 +- .../PrimaryDataStoreProviderManager.java | 8 +- .../PrimaryDataStoreProviderManagerImpl.java | 73 +++++++++++- .../storage/image/TemplateEntityImpl.java | 1 - .../image/db/ImageDaoStoreDaoImpl.java | 10 ++ .../storage/image/db/ImageDataStoreDao.java | 2 +- .../image/db/ImageDataStoreProviderDao.java | 1 + .../db/ImageDataStoreProviderDaoImpl.java | 10 +- .../storage/image/db/ImageDataStoreVO.java | 2 +- .../storage/image/db/ImageDataVO.java | 10 +- .../cloudstack/storage/image/format/VHD.java | 2 +- .../manager/ImageDataStoreManagerImpl.java | 2 +- .../DefaultImageDataStoreProvider.java | 25 +++- .../provider/ImageDataStoreProvider.java | 8 +- .../ImageDataStoreProviderManager.java | 9 +- .../ImageDataStoreProviderManagerImpl.java | 10 +- .../image/store/ImageDataStoreImpl.java | 3 +- .../lifecycle/ImageDataStoreLifeCycle.java | 27 +++++ .../strategy/DefaultVolumeStrategy.java | 5 +- .../storage/volume/VolumeEntityImpl.java | 16 ++- .../storage/volume/VolumeManager.java | 10 +- .../storage/volume/VolumeManagerImpl.java | 44 ++++++- .../storage/volume/VolumeObject.java | 17 ++- .../storage/volume/VolumeServiceImpl.java | 18 +-- .../storage/volume/db/VolumeDao.java | 2 +- .../storage/volume/db/VolumeDaoImpl.java | 2 +- .../storage/volume/db/VolumeVO.java | 14 +-- .../storage/test/volumeServiceTest.java | 110 ++++++++++++++++-- .../storage/test/resource/storageContext.xml | 32 +---- .../com/cloud/upgrade/DatabaseCreator.java | 4 +- setup/db/4.1-new-db-schema.sql | 41 +++++++ setup/db/create-schema.sql | 15 ++- 46 files changed, 682 insertions(+), 189 deletions(-) rename engine/storage/src/org/apache/cloudstack/storage/datastore/db/{DataStoreVO.java => PrimaryDataStoreVO.java} (89%) create mode 100644 engine/storage/src/org/apache/cloudstack/storage/image/store/lifecycle/ImageDataStoreLifeCycle.java create mode 100644 setup/db/4.1-new-db-schema.sql diff --git a/developer/pom.xml b/developer/pom.xml index 53dd00dbe88..c4d77f7dadd 100644 --- a/developer/pom.xml +++ b/developer/pom.xml @@ -145,6 +145,7 @@ com.cloud.upgrade.DatabaseCreator ${basedir}/target/db/create-schema.sql + ${basedir}/target/db/4.1-new-db-schema.sql ${basedir}/target/db/create-schema-premium.sql com.cloud.upgrade.DatabaseUpgradeChecker 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 61736bc535a..b9c9db32efa 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); } diff --git a/engine/storage/src/org/apache/cloudstack/storage/StorageOrchestratorImpl.java b/engine/storage/src/org/apache/cloudstack/storage/StorageOrchestratorImpl.java index efc9b70ef8e..d71b72aa2ca 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 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 9981d68fd40..696085daec2 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 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 f5256325d91..24a5c790688 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 { +public interface PrimaryDataStoreDao extends GenericDao { /** * @param datacenterId * -- the id of the datacenter (availability zone) */ - List listByDataCenterId(long datacenterId); + List listByDataCenterId(long datacenterId); /** * @param datacenterId * -- the id of the datacenter (availability zone) */ - List listBy(long datacenterId, long podId, Long clusterId); + List listBy(long datacenterId, long podId, Long clusterId); /** * Set capacity of storage pool in bytes @@ -59,7 +59,7 @@ public interface PrimaryDataStoreDao extends GenericDao { */ void updateAvailable(long id, long available); - DataStoreVO persist(DataStoreVO pool, Map details); + PrimaryDataStoreVO persist(PrimaryDataStoreVO pool, Map details); /** * Find pool by name. @@ -68,7 +68,7 @@ public interface PrimaryDataStoreDao extends GenericDao { * name of pool. * @return the single StoragePoolVO */ - List findPoolByName(String name); + List findPoolByName(String name); /** * Find pools by the pod that matches the details. @@ -79,9 +79,9 @@ public interface PrimaryDataStoreDao extends GenericDao { * details to match. All must match for the pool to be returned. * @return List of StoragePoolVO */ - List findPoolsByDetails(long dcId, long podId, Long clusterId, Map details); + List findPoolsByDetails(long dcId, long podId, Long clusterId, Map details); - List findPoolsByTags(long dcId, long podId, Long clusterId, String[] tags, Boolean shared); + List findPoolsByTags(long dcId, long podId, Long clusterId, String[] tags, Boolean shared); /** * Find pool by UUID. @@ -90,13 +90,13 @@ public interface PrimaryDataStoreDao extends GenericDao { * uuid of pool. * @return the single StoragePoolVO */ - DataStoreVO findPoolByUUID(String uuid); + PrimaryDataStoreVO findPoolByUUID(String uuid); - List listByStorageHost(String hostFqdnOrIp); + List 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 listPoolByHostPath(String host, String path); + List listPoolByHostPath(String host, String path); void updateDetails(long poolId, Map details); @@ -104,13 +104,13 @@ public interface PrimaryDataStoreDao extends GenericDao { List searchForStoragePoolDetails(long poolId, String value); - List findIfDuplicatePoolsExistByUUID(String uuid); + List findIfDuplicatePoolsExistByUUID(String uuid); - List listByStatus(DataStoreStatus status); + List listByStatus(DataStoreStatus status); long countPoolsByStatus(DataStoreStatus... statuses); - List listByStatusInZone(long dcId, DataStoreStatus status); + List listByStatusInZone(long dcId, DataStoreStatus status); - List listPoolsByCluster(long clusterId); + List listPoolsByCluster(long clusterId); } \ No newline at end of file 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 9986525f469..adf131fa96c 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 implements PrimaryDataStoreDao { - protected final SearchBuilder AllFieldSearch; - protected final SearchBuilder DcPodSearch; - protected final SearchBuilder DcPodAnyClusterSearch; - protected final SearchBuilder DeleteLvmSearch; - protected final GenericSearchBuilder StatusCountSearch; +public class PrimaryDataStoreDaoImpl extends GenericDaoBase implements PrimaryDataStoreDao { + protected final SearchBuilder AllFieldSearch; + protected final SearchBuilder DcPodSearch; + protected final SearchBuilder DcPodAnyClusterSearch; + protected final SearchBuilder DeleteLvmSearch; + protected final GenericSearchBuilder StatusCountSearch; protected final PrimaryDataStoreDetailsDao _detailsDao = null; @@ -105,73 +105,73 @@ public class PrimaryDataStoreDaoImpl extends GenericDaoBase i } @Override - public List findPoolByName(String name) { - SearchCriteria sc = AllFieldSearch.create(); + public List findPoolByName(String name) { + SearchCriteria sc = AllFieldSearch.create(); sc.setParameters("name", name); return listIncludingRemovedBy(sc); } @Override - public DataStoreVO findPoolByUUID(String uuid) { - SearchCriteria sc = AllFieldSearch.create(); + public PrimaryDataStoreVO findPoolByUUID(String uuid) { + SearchCriteria sc = AllFieldSearch.create(); sc.setParameters("uuid", uuid); return findOneIncludingRemovedBy(sc); } @Override - public List findIfDuplicatePoolsExistByUUID(String uuid) { - SearchCriteria sc = AllFieldSearch.create(); + public List findIfDuplicatePoolsExistByUUID(String uuid) { + SearchCriteria sc = AllFieldSearch.create(); sc.setParameters("uuid", uuid); return listBy(sc); } @Override - public List listByDataCenterId(long datacenterId) { - SearchCriteria sc = AllFieldSearch.create(); + public List listByDataCenterId(long datacenterId) { + SearchCriteria 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 listByStorageHost(String hostFqdnOrIp) { - SearchCriteria sc = AllFieldSearch.create(); + public List listByStorageHost(String hostFqdnOrIp) { + SearchCriteria sc = AllFieldSearch.create(); sc.setParameters("hostAddress", hostFqdnOrIp); return listIncludingRemovedBy(sc); } @Override - public List listByStatus(DataStoreStatus status) { - SearchCriteria sc = AllFieldSearch.create(); + public List listByStatus(DataStoreStatus status) { + SearchCriteria sc = AllFieldSearch.create(); sc.setParameters("status", status); return listBy(sc); } @Override - public List listByStatusInZone(long dcId, DataStoreStatus status) { - SearchCriteria sc = AllFieldSearch.create(); + public List listByStatusInZone(long dcId, DataStoreStatus status) { + SearchCriteria 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 sc = AllFieldSearch.create(); + public PrimaryDataStoreVO findPoolByHostPath(long datacenterId, Long podId, String host, String path, String uuid) { + SearchCriteria sc = AllFieldSearch.create(); sc.setParameters("hostAddress", host); sc.setParameters("path", path); sc.setParameters("datacenterId", datacenterId); @@ -182,16 +182,16 @@ public class PrimaryDataStoreDaoImpl extends GenericDaoBase i } @Override - public List listBy(long datacenterId, long podId, Long clusterId) { + public List listBy(long datacenterId, long podId, Long clusterId) { if (clusterId != null) { - SearchCriteria sc = DcPodSearch.create(); + SearchCriteria sc = DcPodSearch.create(); sc.setParameters("datacenterId", datacenterId); sc.setParameters("podId", podId); sc.setParameters("cluster", clusterId); return listBy(sc); } else { - SearchCriteria sc = DcPodAnyClusterSearch.create(); + SearchCriteria sc = DcPodAnyClusterSearch.create(); sc.setParameters("datacenterId", datacenterId); sc.setParameters("podId", podId); return listBy(sc); @@ -199,16 +199,16 @@ public class PrimaryDataStoreDaoImpl extends GenericDaoBase i } @Override - public List listPoolByHostPath(String host, String path) { - SearchCriteria sc = AllFieldSearch.create(); + public List listPoolByHostPath(String host, String path) { + SearchCriteria sc = AllFieldSearch.create(); sc.setParameters("hostAddress", host); sc.setParameters("path", path); return listBy(sc); } - public DataStoreVO listById(Integer id) { - SearchCriteria sc = AllFieldSearch.create(); + public PrimaryDataStoreVO listById(Integer id) { + SearchCriteria sc = AllFieldSearch.create(); sc.setParameters("id", id); return findOneIncludingRemovedBy(sc); @@ -216,7 +216,7 @@ public class PrimaryDataStoreDaoImpl extends GenericDaoBase i @Override @DB - public DataStoreVO persist(DataStoreVO pool, Map details) { + public PrimaryDataStoreVO persist(PrimaryDataStoreVO pool, Map details) { Transaction txn = Transaction.currentTxn(); txn.start(); pool = super.persist(pool); @@ -232,7 +232,7 @@ public class PrimaryDataStoreDaoImpl extends GenericDaoBase i @DB @Override - public List findPoolsByDetails(long dcId, long podId, Long clusterId, Map details) { + public List findPoolsByDetails(long dcId, long podId, Long clusterId, Map 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 i } pstmt.setInt(i++, details.size()); ResultSet rs = pstmt.executeQuery(); - List pools = new ArrayList(); + List pools = new ArrayList(); while (rs.next()) { pools.add(toEntityBean(rs, false)); } @@ -273,8 +273,8 @@ public class PrimaryDataStoreDaoImpl extends GenericDaoBase i } @Override - public List findPoolsByTags(long dcId, long podId, Long clusterId, String[] tags, Boolean shared) { - List storagePools = null; + public List findPoolsByTags(long dcId, long podId, Long clusterId, String[] tags, Boolean shared) { + List storagePools = null; if (tags == null || tags.length == 0) { storagePools = listBy(dcId, podId, clusterId); } else { @@ -285,8 +285,8 @@ public class PrimaryDataStoreDaoImpl extends GenericDaoBase i if (shared == null) { return storagePools; } else { - List filteredStoragePools = new ArrayList(storagePools); - for (DataStoreVO pool : storagePools) { + List filteredStoragePools = new ArrayList(storagePools); + for (PrimaryDataStoreVO pool : storagePools) { /* * if (shared != pool.isShared()) { * filteredStoragePools.remove(pool); } @@ -357,8 +357,8 @@ public class PrimaryDataStoreDaoImpl extends GenericDaoBase i } @Override - public List listPoolsByCluster(long clusterId) { - SearchCriteria sc = AllFieldSearch.create(); + public List listPoolsByCluster(long clusterId) { + SearchCriteria sc = AllFieldSearch.create(); sc.setParameters("clusterId", clusterId); return listBy(sc); 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 2fb556eb81d..ebba01ce3f8 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 { - + public PrimaryDataStoreProviderVO findByName(String name); } 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 c65ca4c1f92..0050c2f0df4 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 implements PrimaryDataStoreProviderDao { + @Override + public PrimaryDataStoreProviderVO findByName(String name) { + SearchCriteriaService sc = SearchCriteria2.create(PrimaryDataStoreProviderVO.class); + sc.addAnd(sc.getEntity().getName(), Op.EQ, name); + return sc.find(); + } + } \ No newline at end of file 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 4047819ec71..7e31d9c1b21 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; + } } diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/db/DataStoreVO.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreVO.java similarity index 89% rename from engine/storage/src/org/apache/cloudstack/storage/datastore/db/DataStoreVO.java rename to engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreVO.java index dc732d95a41..6c05d104393 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/datastore/db/DataStoreVO.java +++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreVO.java @@ -40,7 +40,7 @@ import com.cloud.utils.db.GenericDao; @Entity @Table(name = "storage_pool") -public class DataStoreVO implements Identity { +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) @@ -81,11 +81,8 @@ public class DataStoreVO implements Identity { @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 = "storage_provider_id", updatable = true, nullable = false) + private Long storageProviderId; @Column(name = "host_address") private String hostAddress; @@ -110,7 +107,7 @@ public class DataStoreVO implements Identity { return status; } - public DataStoreVO() { + public PrimaryDataStoreVO() { // TODO Auto-generated constructor stub } @@ -125,6 +122,10 @@ public class DataStoreVO implements Identity { public String getPoolType() { return protocol; } + + public void setPoolType(String protocol) { + this.protocol = protocol; + } public Date getCreated() { return created; @@ -147,19 +148,11 @@ public class DataStoreVO implements Identity { } public Long getStorageProviderId() { - return storageProvider; + return storageProviderId; } public void setStorageProviderId(Long provider) { - storageProvider = provider; - } - - public String getStorageType() { - return storageType; - } - - public void setStorageType(String type) { - storageType = type; + storageProviderId = provider; } public long getCapacityBytes() { @@ -185,6 +178,10 @@ public class DataStoreVO implements Identity { public String getHostAddress() { return hostAddress; } + + public void setHostAddress(String host) { + this.hostAddress = host; + } public String getPath() { return path; @@ -225,6 +222,10 @@ public class DataStoreVO implements Identity { public int getPort() { return port; } + + public void setPort(int port) { + this.port = port; + } public Long getPodId() { return podId; @@ -236,10 +237,10 @@ public class DataStoreVO implements Identity { @Override public boolean equals(Object obj) { - if (!(obj instanceof DataStoreVO) || obj == null) { + if (!(obj instanceof PrimaryDataStoreVO) || obj == null) { return false; } - DataStoreVO that = (DataStoreVO) obj; + PrimaryDataStoreVO that = (PrimaryDataStoreVO) obj; return this.id == that.id; } 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 a50ebdc5e2d..c16c230afd8 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 dsInfos) { - // TODO Auto-generated method stub - return false; + public PrimaryDataStoreInfo registerDataStore(Map 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 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 99bb995cb7e..570a622a4ad 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 dsInfos); + public PrimaryDataStoreInfo registerDataStore(Map dsInfos); public boolean attach(long scope); 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 e55b126e0f5..91528ba214b 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); 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 6126a8a388f..8437872d714 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 params) { + this.provider = provider; + return true; + } + + @Override + public boolean init(PrimaryDataStoreProviderVO provider) { + this.provider = provider; + return true; + } + + @Override + public String getName() { + return providerName; + } + } 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 dcc80931eac..b4a82a8fc9a 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 params); + public boolean init(PrimaryDataStoreProviderVO provider); } 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 85a132f7591..5ede09c943b 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 getDataStoreProviders(); } 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 809a7e5783c..c0ad052e50e 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 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 params) throws ConfigurationException { + List 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 getDataStoreProviders() { + return providers; + } } 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 e775d25f119..6aacfeea0db 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; 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 995aa5e8b88..3f3e9ca95fb 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 implements ImageDataStoreDao { + @Override + public ImageDataStoreVO findByName(String name) { + SearchCriteriaService sc = SearchCriteria2.create(ImageDataStoreVO.class); + sc.addAnd(sc.getEntity().getName(), Op.EQ, name); + return sc.find(); + } + } 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 1a95c2dff48..d7358be9140 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 { - + public ImageDataStoreVO findByName(String name); } 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 37a2fe97d6c..1b13b7ae4e2 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 { + public ImageDataStoreProviderVO findByName(String name); } 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 49419d3972d..f86bf1513b7 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 implements ImageDataStoreProviderDao { - + @Override + public ImageDataStoreProviderVO findByName(String name) { + SearchCriteriaService service = SearchCriteria2.create(ImageDataStoreProviderVO.class); + service.addAnd(service.getEntity().getName(), Op.EQ, name); + return service.find(); + } } 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 509441885da..5b660ec80fb 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() { 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 efce33cb1ba..19ed0fd74a3 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; 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 f979ac35355..89cd424311e 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"; 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 ebd60f14621..bf4335675ef 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; 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 bfb915feb5c..585c54bdf7c 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 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()); + } } 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 8776827baa5..76ab3405130 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(); } 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 2359a2737e0..f03a0e14cca 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 listProvider(); public ImageDataStore getDataStore(Long dataStoreId); public ImageDataStore getDataStoreFromTemplateId(long templateId); + /** + * @param name + * @return + */ + ImageDataStoreProvider getProvider(String name); } 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 602973a8ab8..32f800cb4eb 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 listProvider() { + return providers; + } } 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 8f1b3735123..5ba91f79ac0 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 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 00000000000..a96983c22ee --- /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 params); +} 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 8d1ab797130..0f8410907cb 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) { 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 cc48f10ada6..d4064d18612 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; + } + } 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 22e9bafa5d0..f27753dd2d7 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 getStateMachine(); } diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeManagerImpl.java b/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeManagerImpl.java index 241bc3b8f29..e6508e6274e 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeManagerImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeManagerImpl.java @@ -19,29 +19,67 @@ package org.apache.cloudstack.storage.volume; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeProfile; +import org.apache.cloudstack.storage.volume.db.VolumeDao; +import org.apache.cloudstack.storage.volume.db.VolumeVO; +import org.springframework.stereotype.Component; -import com.cloud.storage.VolumeVO; import com.cloud.storage.Volume; -import com.cloud.storage.dao.VolumeDao; +import com.cloud.storage.Volume.Event; +import com.cloud.storage.Volume.State; import com.cloud.utils.component.Inject; import com.cloud.utils.fsm.NoTransitionException; import com.cloud.utils.fsm.StateMachine2; +@Component public class VolumeManagerImpl implements VolumeManager { - private StateMachine2 _volStateMachine; @Inject protected VolumeDao _volumeDao; + private final static StateMachine2 s_fsm = new StateMachine2(); + public VolumeManagerImpl() { + initStateMachine(); + } public VolumeVO allocateDuplicateVolume(VolumeVO oldVol) { + /* VolumeVO newVol = new VolumeVO(oldVol.getVolumeType(), oldVol.getName(), oldVol.getDataCenterId(), oldVol.getDomainId(), oldVol.getAccountId(), oldVol.getDiskOfferingId(), oldVol.getSize()); newVol.setTemplateId(oldVol.getTemplateId()); newVol.setDeviceId(oldVol.getDeviceId()); newVol.setInstanceId(oldVol.getInstanceId()); newVol.setRecreatable(oldVol.isRecreatable()); newVol.setReservationId(oldVol.getReservationId()); + */ return null; // return _volumeDao.persist(newVol); } + + private void initStateMachine() { + s_fsm.addTransition(Volume.State.Allocated, Event.CreateRequested, Volume.State.Creating); + s_fsm.addTransition(Volume.State.Allocated, Event.DestroyRequested, Volume.State.Destroy); + s_fsm.addTransition(Volume.State.Creating, Event.OperationRetry, Volume.State.Creating); + s_fsm.addTransition(Volume.State.Creating, Event.OperationFailed, Volume.State.Allocated); + s_fsm.addTransition(Volume.State.Creating, Event.OperationSucceeded, Volume.State.Ready); + s_fsm.addTransition(Volume.State.Creating, Event.DestroyRequested, Volume.State.Destroy); + s_fsm.addTransition(Volume.State.Creating, Event.CreateRequested, Volume.State.Creating); + s_fsm.addTransition(Volume.State.Allocated, Event.UploadRequested, Volume.State.UploadOp); + s_fsm.addTransition(Volume.State.UploadOp, Event.CopyRequested, Volume.State.Creating);// CopyRequested for volume from sec to primary storage + s_fsm.addTransition(Volume.State.Creating, Event.CopySucceeded, Volume.State.Ready); + s_fsm.addTransition(Volume.State.Creating, Event.CopyFailed, Volume.State.UploadOp);// Copying volume from sec to primary failed. + s_fsm.addTransition(Volume.State.UploadOp, Event.DestroyRequested, Volume.State.Destroy); + s_fsm.addTransition(Volume.State.Ready, Event.DestroyRequested, Volume.State.Destroy); + s_fsm.addTransition(Volume.State.Destroy, Event.ExpungingRequested, Volume.State.Expunging); + s_fsm.addTransition(Volume.State.Ready, Event.SnapshotRequested, Volume.State.Snapshotting); + s_fsm.addTransition(Volume.State.Snapshotting, Event.OperationSucceeded, Volume.State.Ready); + s_fsm.addTransition(Volume.State.Snapshotting, Event.OperationFailed, Volume.State.Ready); + s_fsm.addTransition(Volume.State.Ready, Event.MigrationRequested, Volume.State.Migrating); + s_fsm.addTransition(Volume.State.Migrating, Event.OperationSucceeded, Volume.State.Ready); + s_fsm.addTransition(Volume.State.Migrating, Event.OperationFailed, Volume.State.Ready); + s_fsm.addTransition(Volume.State.Destroy, Event.OperationSucceeded, Volume.State.Destroy); + } + + @Override + public StateMachine2 getStateMachine() { + return s_fsm; + } public VolumeVO processEvent(Volume vol, Volume.Event event) throws NoTransitionException { // _volStateMachine.transitTo(vol, event, null, _volumeDao); diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeObject.java b/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeObject.java index f57fb758387..f0eb1b5bd78 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeObject.java +++ b/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeObject.java @@ -18,6 +18,7 @@ import org.apache.log4j.Logger; import com.cloud.storage.Volume; import com.cloud.storage.Volume.State; +import com.cloud.utils.component.ComponentInject; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.fsm.NoTransitionException; import com.cloud.utils.fsm.StateMachine2; @@ -25,7 +26,7 @@ import com.cloud.utils.fsm.StateMachine2; public class VolumeObject implements VolumeInfo { private static final Logger s_logger = Logger.getLogger(VolumeObject.class); protected VolumeVO volumeVO; - private StateMachine2 _volStateMachine; + private StateMachine2 _volStateMachine; protected PrimaryDataStore dataStore; @Inject VolumeDiskTypeHelper diskTypeHelper; @@ -33,11 +34,18 @@ public class VolumeObject implements VolumeInfo { VolumeTypeHelper volumeTypeHelper; @Inject VolumeDao volumeDao; - - public VolumeObject(PrimaryDataStore dataStore, VolumeVO volumeVO) { + @Inject + VolumeManager volumeMgr; + private VolumeObject(PrimaryDataStore dataStore, VolumeVO volumeVO) { this.volumeVO = volumeVO; this.dataStore = dataStore; } + + public static VolumeObject getVolumeObject(PrimaryDataStore dataStore, VolumeVO volumeVO) { + VolumeObject vo = new VolumeObject(dataStore, volumeVO); + vo = ComponentInject.inject(vo); + return vo; + } public String getUuid() { return volumeVO.getUuid(); @@ -91,8 +99,9 @@ public class VolumeObject implements VolumeInfo { volumeVO.setDiskType(type.toString()); } - public boolean stateTransit(VolumeEvent event) { + public boolean stateTransit(Volume.Event event) { boolean result = false; + _volStateMachine = volumeMgr.getStateMachine(); try { result = _volStateMachine.transitTo(volumeVO, event, null, volumeDao); } catch (NoTransitionException e) { diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java b/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java index f994847f464..0e6ed9f425e 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java @@ -68,14 +68,14 @@ public class VolumeServiceImpl implements VolumeService { } VolumeObject vo = (VolumeObject) volume; - vo.stateTransit(VolumeEvent.CreateRequested); + vo.stateTransit(Volume.Event.CreateRequested); try { VolumeInfo vi = dataStore.createVolume(vo, diskType); - vo.stateTransit(VolumeEvent.OperationSucceeded); + vo.stateTransit(Volume.Event.OperationSucceeded); return vi; } catch (Exception e) { - vo.stateTransit(VolumeEvent.OperationFailed); + vo.stateTransit(Volume.Event.OperationFailed); throw new CloudRuntimeException(e.toString()); } } @@ -107,7 +107,7 @@ public class VolumeServiceImpl implements VolumeService { @Override public VolumeEntity allocateVolumeInDb(long size, VolumeType type, String volName, Long templateId) { VolumeVO vo = volDao.allocVolume(size, type, volName, templateId); - return new VolumeEntityImpl(new VolumeObject(null, vo)); + return new VolumeEntityImpl(VolumeObject.getVolumeObject(null, vo), this); } @Override @@ -118,10 +118,10 @@ public class VolumeServiceImpl implements VolumeService { } if (vo.getPoolId() == null) { - return new VolumeEntityImpl(new VolumeObject(null, vo)); + return new VolumeEntityImpl(VolumeObject.getVolumeObject(null, vo), this); } else { PrimaryDataStore dataStore = dataStoreMgr.getPrimaryDataStore(vo.getPoolId()); - return new VolumeEntityImpl(dataStore.getVolume(volumeId)); + return new VolumeEntityImpl(dataStore.getVolume(volumeId), this); } } @@ -164,16 +164,16 @@ public class VolumeServiceImpl implements VolumeService { VolumeObject vo = (VolumeObject) volume; try { - vo.stateTransit(VolumeEvent.CreateRequested); + vo.stateTransit(Volume.Event.CreateRequested); } catch (Exception e) { throw new CloudRuntimeException(e.toString()); } try { volume = pd.createVoluemFromBaseImage(volume, templateOnPrimaryStore); - vo.stateTransit(VolumeEvent.OperationSucceeded); + vo.stateTransit(Volume.Event.OperationSucceeded); } catch (Exception e) { - vo.stateTransit(VolumeEvent.OperationFailed); + vo.stateTransit(Volume.Event.OperationFailed); throw new CloudRuntimeException(e.toString()); } return volume; diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/db/VolumeDao.java b/engine/storage/src/org/apache/cloudstack/storage/volume/db/VolumeDao.java index 85124ec9cad..ccc190183fd 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/volume/db/VolumeDao.java +++ b/engine/storage/src/org/apache/cloudstack/storage/volume/db/VolumeDao.java @@ -28,7 +28,7 @@ import com.cloud.utils.Pair; import com.cloud.utils.db.GenericDao; import com.cloud.utils.fsm.StateDao; -public interface VolumeDao extends GenericDao, StateDao { +public interface VolumeDao extends GenericDao, StateDao { List findDetachedByAccount(long accountId); diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/db/VolumeDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/volume/db/VolumeDaoImpl.java index 59211a88d82..980e4f83da4 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/volume/db/VolumeDaoImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/volume/db/VolumeDaoImpl.java @@ -335,7 +335,7 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol } @Override - public boolean updateState(Volume.State currentState, VolumeEvent event, Volume.State nextState, VolumeVO vo, Object data) { + public boolean updateState(Volume.State currentState, Volume.Event event, Volume.State nextState, VolumeVO vo, Object data) { Long oldUpdated = vo.getUpdatedCount(); Date oldUpdatedTime = vo.getUpdated(); diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/db/VolumeVO.java b/engine/storage/src/org/apache/cloudstack/storage/volume/db/VolumeVO.java index 04104f67797..32e6e3bc01b 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/volume/db/VolumeVO.java +++ b/engine/storage/src/org/apache/cloudstack/storage/volume/db/VolumeVO.java @@ -141,16 +141,14 @@ public class VolumeVO implements Identity, StateObject { @Column(name = "uuid") String uuid; - @Column(name = "reservation") - String reservationId; - // Real Constructor public VolumeVO(long size, String type, String name, Long templateId) { - this.volumeType = type.toString(); + this.volumeType = type; this.size = size; this.name = name; this.templateId = templateId; this.uuid = UUID.randomUUID().toString(); + this.state = Volume.State.Allocated; } // Copy Constructor @@ -398,14 +396,6 @@ public class VolumeVO implements Identity, StateObject { } } - public String getReservationId() { - return this.reservationId; - } - - public void setReservationId(String reserv) { - this.reservationId = reserv; - } - @Override public String getUuid() { return this.uuid; diff --git a/engine/storage/test/org/apache/cloudstack/storage/test/volumeServiceTest.java b/engine/storage/test/org/apache/cloudstack/storage/test/volumeServiceTest.java index d096cd5a45c..2c832107e50 100644 --- a/engine/storage/test/org/apache/cloudstack/storage/test/volumeServiceTest.java +++ b/engine/storage/test/org/apache/cloudstack/storage/test/volumeServiceTest.java @@ -23,26 +23,43 @@ import static org.junit.Assert.*; import java.awt.List; import java.util.HashMap; import java.util.LinkedList; +import java.util.Map; +import java.util.UUID; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import javax.inject.Inject; import javax.naming.ConfigurationException; +import org.apache.cloudstack.engine.cloud.entity.api.TemplateEntity; +import org.apache.cloudstack.engine.cloud.entity.api.VolumeEntity; +import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo; import org.apache.cloudstack.engine.subsystem.api.storage.disktype.QCOW2; import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VHD; import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VMDK; import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskType; import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskTypeHelper; +import org.apache.cloudstack.engine.subsystem.api.storage.type.RootDisk; import org.apache.cloudstack.engine.subsystem.api.storage.type.VolumeTypeHelper; import org.apache.cloudstack.storage.datastore.DefaultPrimaryDataStoreImpl; +import org.apache.cloudstack.storage.datastore.lifecycle.PrimaryDataStoreLifeCycle; import org.apache.cloudstack.storage.datastore.provider.DefaultPrimaryDatastoreProviderImpl; +import org.apache.cloudstack.storage.datastore.provider.PrimaryDataStoreProvider; +import org.apache.cloudstack.storage.datastore.provider.PrimaryDataStoreProviderManager; +import org.apache.cloudstack.storage.image.ImageService; +import org.apache.cloudstack.storage.image.db.ImageDataDao; +import org.apache.cloudstack.storage.image.db.ImageDataVO; import org.apache.cloudstack.storage.image.format.ISO; import org.apache.cloudstack.storage.image.format.ImageFormat; import org.apache.cloudstack.storage.image.format.ImageFormatHelper; import org.apache.cloudstack.storage.image.format.OVA; import org.apache.cloudstack.storage.image.format.Unknown; +import org.apache.cloudstack.storage.image.provider.ImageDataStoreProvider; import org.apache.cloudstack.storage.image.provider.ImageDataStoreProviderManager; +import org.apache.cloudstack.storage.image.store.ImageDataStore; +import org.apache.cloudstack.storage.volume.VolumeService; +import org.apache.cloudstack.storage.volume.db.VolumeDao; +import org.apache.cloudstack.storage.volume.db.VolumeVO; import org.junit.Before; import org.junit.Test; @@ -54,31 +71,110 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.mockito.Mockito.*; +import com.cloud.storage.Storage.TemplateType; import com.cloud.utils.component.ComponentInject; import com.cloud.utils.db.DB; +import com.cloud.utils.db.Transaction; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations="classpath:/resource/storageContext.xml") public class volumeServiceTest { @Inject ImageDataStoreProviderManager imageProviderMgr; + @Inject + ImageService imageService; + @Inject + VolumeService volumeService; + @Inject + ImageDataDao imageDataDao; + @Inject + VolumeDao volumeDao; + @Inject + PrimaryDataStoreProviderManager primaryDataStoreProviderMgr; @Before public void setUp() { } - @Test - public void test() { + private ImageDataVO createImageData() { + ImageDataVO image = new ImageDataVO(); + image.setTemplateType(TemplateType.USER); + image.setUrl("http://testurl/test.vhd"); + image.setUniqueName(UUID.randomUUID().toString()); + image.setName(UUID.randomUUID().toString()); + image.setPublicTemplate(true); + image.setFeatured(true); + image.setRequireHvm(true); + image.setBits(64); + image.setFormat(new VHD().toString()); + image.setAccountId(1); + image.setEnablePassword(true); + image.setEnableSshKey(true); + image.setGuestOSId(1); + image.setBootable(true); + image.setPrepopulate(true); + image.setCrossZones(true); + image.setExtractable(true); + image = imageDataDao.persist(image); + return image; + } + + private TemplateEntity createTemplate() { try { - imageProviderMgr.configure("image Provider", new HashMap()); - + ImageDataVO image = createImageData(); + ImageDataStoreProvider defaultProvider = imageProviderMgr.getProvider("DefaultProvider"); + ImageDataStore store = defaultProvider.registerDataStore("defaultHttpStore", new HashMap()); + imageService.registerTemplate(image.getId(), store.getImageDataStoreId()); + TemplateEntity te = imageService.getTemplateEntity(image.getId()); + return te; } catch (ConfigurationException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + return null; } } + @Test + public void createTemplateTest() { + createTemplate(); + } + + private PrimaryDataStoreInfo createPrimaryDataStore() { + try { + primaryDataStoreProviderMgr.configure("primary data store mgr", new HashMap()); + PrimaryDataStoreProvider provider = primaryDataStoreProviderMgr.getDataStoreProvider("default primary data store provider"); + PrimaryDataStoreLifeCycle lifeCycle = provider.getDataStoreLifeCycle(); + Map params = new HashMap(); + params.put("url", "nfs://test/test"); + params.put("dcId", "1"); + params.put("name", "my primary data store"); + PrimaryDataStoreInfo primaryDataStoreInfo = lifeCycle.registerDataStore(params); + return primaryDataStoreInfo; + } catch (ConfigurationException e) { + return null; + } + } + + @Test + public void createPrimaryDataStoreTest() { + createPrimaryDataStore(); + } + + private VolumeVO createVolume(long templateId) { + VolumeVO volume = new VolumeVO(1000, new RootDisk().toString(), UUID.randomUUID().toString(), templateId); + volume = volumeDao.persist(volume); + return volume; + + } + + @Test + public void createVolumeFromTemplate() { + TemplateEntity te = createTemplate(); + PrimaryDataStoreInfo dataStoreInfo = createPrimaryDataStore(); + VolumeVO volume = createVolume(te.getId()); + VolumeEntity ve = volumeService.getVolumeEntity(volume.getId()); + ve.createVolumeFromTemplate(dataStoreInfo.getId(), new VHD(), te); + } + //@Test public void test1() { System.out.println(VolumeTypeHelper.getType("Root")); @@ -105,7 +201,7 @@ public class volumeServiceTest { //@Test public void testStaticBean() { DefaultPrimaryDatastoreProviderImpl provider = ComponentInject.inject(DefaultPrimaryDatastoreProviderImpl.class); - assertNotNull(provider.dataStoreDao); + //assertNotNull(provider.dataStoreDao); DefaultPrimaryDataStoreImpl dpdsi = new DefaultPrimaryDataStoreImpl(null, null, null); ComponentInject.inject(dpdsi); diff --git a/engine/storage/test/resource/storageContext.xml b/engine/storage/test/resource/storageContext.xml index 0dab1f559b0..dbc997f1493 100644 --- a/engine/storage/test/resource/storageContext.xml +++ b/engine/storage/test/resource/storageContext.xml @@ -12,6 +12,7 @@ http://www.springframework.org/schema/context/spring-context-3.0.xsd"> + @@ -28,36 +29,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - +