diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDao.java b/engine/api/src/org/apache/cloudstack/storage/datastore/db/ImageStoreDao.java similarity index 94% rename from engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDao.java rename to engine/api/src/org/apache/cloudstack/storage/datastore/db/ImageStoreDao.java index 18841bc16e2..a81fa9c0bc1 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDao.java +++ b/engine/api/src/org/apache/cloudstack/storage/datastore/db/ImageStoreDao.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.cloudstack.storage.image.db; +package org.apache.cloudstack.storage.datastore.db; import com.cloud.utils.db.GenericDao; diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDetailVO.java b/engine/api/src/org/apache/cloudstack/storage/datastore/db/ImageStoreDetailVO.java similarity index 97% rename from engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDetailVO.java rename to engine/api/src/org/apache/cloudstack/storage/datastore/db/ImageStoreDetailVO.java index 3afddaa9c24..63ac9e4f3f9 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDetailVO.java +++ b/engine/api/src/org/apache/cloudstack/storage/datastore/db/ImageStoreDetailVO.java @@ -14,7 +14,7 @@ // 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.db; +package org.apache.cloudstack.storage.datastore.db; import org.apache.cloudstack.api.InternalIdentity; diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDetailsDao.java b/engine/api/src/org/apache/cloudstack/storage/datastore/db/ImageStoreDetailsDao.java similarity index 92% rename from engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDetailsDao.java rename to engine/api/src/org/apache/cloudstack/storage/datastore/db/ImageStoreDetailsDao.java index 98672904d54..033a818faa7 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDetailsDao.java +++ b/engine/api/src/org/apache/cloudstack/storage/datastore/db/ImageStoreDetailsDao.java @@ -14,7 +14,7 @@ // 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.db; +package org.apache.cloudstack.storage.datastore.db; import java.util.Map; @@ -24,5 +24,8 @@ import com.cloud.utils.db.GenericDao; public interface ImageStoreDetailsDao extends GenericDao { void update(long storeId, Map details); + Map getDetails(long storeId); + + void deleteDetails(long storeId); } diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreVO.java b/engine/api/src/org/apache/cloudstack/storage/datastore/db/ImageStoreVO.java similarity index 98% rename from engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreVO.java rename to engine/api/src/org/apache/cloudstack/storage/datastore/db/ImageStoreVO.java index 36d05e56011..62c1be05eee 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreVO.java +++ b/engine/api/src/org/apache/cloudstack/storage/datastore/db/ImageStoreVO.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.cloudstack.storage.image.db; +package org.apache.cloudstack.storage.datastore.db; import java.util.Date; diff --git a/engine/storage/src/org/apache/cloudstack/storage/db/SnapshotDataStoreDao.java b/engine/api/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java similarity index 68% rename from engine/storage/src/org/apache/cloudstack/storage/db/SnapshotDataStoreDao.java rename to engine/api/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java index 8a62766fa8f..4d92fd3311d 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/db/SnapshotDataStoreDao.java +++ b/engine/api/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java @@ -14,14 +14,22 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package org.apache.cloudstack.storage.db; +package org.apache.cloudstack.storage.datastore.db; +import java.util.List; + import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine; + import com.cloud.utils.db.GenericDao; import com.cloud.utils.fsm.StateDao; -public interface SnapshotDataStoreDao extends GenericDao, StateDao { +public interface SnapshotDataStoreDao extends GenericDao, StateDao { + public List listByStoreId(long id); + + public List listLiveByStoreId(long id); + + public void deletePrimaryRecordsForStore(long id); } diff --git a/engine/storage/src/org/apache/cloudstack/storage/db/SnapshotDataStoreVO.java b/engine/api/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreVO.java similarity index 99% rename from engine/storage/src/org/apache/cloudstack/storage/db/SnapshotDataStoreVO.java rename to engine/api/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreVO.java index 527385f4be3..0f9c95ad8cf 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/db/SnapshotDataStoreVO.java +++ b/engine/api/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreVO.java @@ -14,7 +14,7 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package org.apache.cloudstack.storage.db; +package org.apache.cloudstack.storage.datastore.db; import java.util.Date; diff --git a/engine/storage/src/org/apache/cloudstack/storage/db/TemplateDataStoreDao.java b/engine/api/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java similarity index 81% rename from engine/storage/src/org/apache/cloudstack/storage/db/TemplateDataStoreDao.java rename to engine/api/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java index 2faf3c729c9..591b84c89f0 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/db/TemplateDataStoreDao.java +++ b/engine/api/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java @@ -14,9 +14,10 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package org.apache.cloudstack.storage.db; +package org.apache.cloudstack.storage.datastore.db; + +import java.util.List; -import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore; import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine; import com.cloud.utils.db.GenericDao; @@ -24,4 +25,9 @@ import com.cloud.utils.fsm.StateDao; public interface TemplateDataStoreDao extends GenericDao, StateDao { + public List listByStoreId(long id); + + public List listLiveByStoreId(long id); + + public void deletePrimaryRecordsForStore(long id); } diff --git a/engine/storage/src/org/apache/cloudstack/storage/db/TemplateDataStoreVO.java b/engine/api/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreVO.java similarity index 99% rename from engine/storage/src/org/apache/cloudstack/storage/db/TemplateDataStoreVO.java rename to engine/api/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreVO.java index af393a5221d..4e48437ec2a 100755 --- a/engine/storage/src/org/apache/cloudstack/storage/db/TemplateDataStoreVO.java +++ b/engine/api/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreVO.java @@ -14,7 +14,7 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package org.apache.cloudstack.storage.db; +package org.apache.cloudstack.storage.datastore.db; import java.util.Date; diff --git a/engine/storage/src/org/apache/cloudstack/storage/db/VolumeDataStoreDao.java b/engine/api/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreDao.java similarity index 81% rename from engine/storage/src/org/apache/cloudstack/storage/db/VolumeDataStoreDao.java rename to engine/api/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreDao.java index e687d88082f..709097ea4a1 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/db/VolumeDataStoreDao.java +++ b/engine/api/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreDao.java @@ -14,9 +14,11 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package org.apache.cloudstack.storage.db; +package org.apache.cloudstack.storage.datastore.db; +import java.util.List; + import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine; import com.cloud.utils.db.GenericDao; @@ -24,4 +26,9 @@ import com.cloud.utils.fsm.StateDao; public interface VolumeDataStoreDao extends GenericDao, StateDao { + public List listByStoreId(long id); + + public List listLiveByStoreId(long id); + + public void deletePrimaryRecordsForStore(long id); } diff --git a/engine/storage/src/org/apache/cloudstack/storage/db/VolumeDataStoreVO.java b/engine/api/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreVO.java similarity index 99% rename from engine/storage/src/org/apache/cloudstack/storage/db/VolumeDataStoreVO.java rename to engine/api/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreVO.java index b27a4baa902..1fb61845fcc 100755 --- a/engine/storage/src/org/apache/cloudstack/storage/db/VolumeDataStoreVO.java +++ b/engine/api/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreVO.java @@ -14,7 +14,7 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package org.apache.cloudstack.storage.db; +package org.apache.cloudstack.storage.datastore.db; import java.util.Date; diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageStoreProviderManagerImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageStoreProviderManagerImpl.java index 7ea68dc731f..9694a4cf703 100644 --- a/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageStoreProviderManagerImpl.java +++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageStoreProviderManagerImpl.java @@ -29,11 +29,11 @@ import javax.inject.Inject; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProviderManager; import org.apache.cloudstack.engine.subsystem.api.storage.ImageStoreProvider; +import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; +import org.apache.cloudstack.storage.datastore.db.ImageStoreVO; import org.apache.cloudstack.storage.image.ImageStoreDriver; import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity; import org.apache.cloudstack.storage.image.datastore.ImageStoreProviderManager; -import org.apache.cloudstack.storage.image.db.ImageStoreDao; -import org.apache.cloudstack.storage.image.db.ImageStoreVO; import org.apache.cloudstack.storage.image.store.ImageStoreImpl; import org.springframework.stereotype.Component; diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageStoreImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageStoreImpl.java index 60c71f0ffa5..17f2b899777 100644 --- a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageStoreImpl.java +++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageStoreImpl.java @@ -32,9 +32,9 @@ import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope; import org.apache.cloudstack.storage.datastore.ObjectInDataStoreManager; +import org.apache.cloudstack.storage.datastore.db.ImageStoreVO; import org.apache.cloudstack.storage.image.ImageStoreDriver; import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity; -import org.apache.cloudstack.storage.image.db.ImageStoreVO; import com.cloud.storage.ImageStore; import com.cloud.storage.dao.VMTemplateDao; diff --git a/engine/api/src/org/apache/cloudstack/storage/datastore/db/DataStoreProviderDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/db/DataStoreProviderDaoImpl.java similarity index 88% rename from engine/api/src/org/apache/cloudstack/storage/datastore/db/DataStoreProviderDaoImpl.java rename to engine/storage/src/org/apache/cloudstack/storage/db/DataStoreProviderDaoImpl.java index ccb6b483253..fce716a08a6 100644 --- a/engine/api/src/org/apache/cloudstack/storage/datastore/db/DataStoreProviderDaoImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/db/DataStoreProviderDaoImpl.java @@ -16,8 +16,10 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.cloudstack.storage.datastore.db; +package org.apache.cloudstack.storage.db; +import org.apache.cloudstack.storage.datastore.db.DataStoreProviderDao; +import org.apache.cloudstack.storage.datastore.db.DataStoreProviderVO; import org.springframework.stereotype.Component; import com.cloud.utils.db.GenericDaoBase; diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreHelper.java b/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreHelper.java index 30ebd1d1b83..eb264047cfa 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreHelper.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreHelper.java @@ -23,10 +23,10 @@ import java.util.Map; import javax.inject.Inject; -import org.apache.cloudstack.storage.image.db.ImageStoreDao; -import org.apache.cloudstack.storage.image.db.ImageStoreDetailVO; -import org.apache.cloudstack.storage.image.db.ImageStoreDetailsDao; -import org.apache.cloudstack.storage.image.db.ImageStoreVO; +import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; +import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailVO; +import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao; +import org.apache.cloudstack.storage.datastore.db.ImageStoreVO; import org.springframework.stereotype.Component; import com.cloud.storage.ImageStore; diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDaoImpl.java index 60d414c893d..2becada51a1 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDaoImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDaoImpl.java @@ -18,6 +18,8 @@ */ package org.apache.cloudstack.storage.image.db; +import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; +import org.apache.cloudstack.storage.datastore.db.ImageStoreVO; import org.springframework.stereotype.Component; import com.cloud.utils.db.GenericDaoBase; diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDetailsDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDetailsDaoImpl.java index e96d6fd93dc..8f711c686de 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDetailsDaoImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDetailsDaoImpl.java @@ -22,8 +22,11 @@ import java.util.Map; import javax.ejb.Local; +import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailVO; +import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao; import org.springframework.stereotype.Component; +import com.cloud.host.DetailVO; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; @@ -70,4 +73,18 @@ public class ImageStoreDetailsDaoImpl extends GenericDaoBase sc = storeSearch.create(); + sc.setParameters("store", storeId); + + List results = search(sc, null); + for (ImageStoreDetailVO result : results) { + remove(result.getId()); + } + + } + + } diff --git a/engine/storage/src/org/apache/cloudstack/storage/db/SnapshotDataStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java similarity index 64% rename from engine/storage/src/org/apache/cloudstack/storage/db/SnapshotDataStoreDaoImpl.java rename to engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java index 1c291db1bd4..1fed7919a58 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/db/SnapshotDataStoreDaoImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java @@ -14,32 +14,48 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package org.apache.cloudstack.storage.db; +package org.apache.cloudstack.storage.image.db; import java.util.Date; +import java.util.List; import java.util.Map; import javax.naming.ConfigurationException; -import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore; import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event; import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State; +import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao; +import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; +import com.cloud.storage.StoragePoolHostVO; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; +import com.cloud.utils.db.Transaction; import com.cloud.utils.db.SearchCriteria.Op; import com.cloud.utils.db.UpdateBuilder; @Component -public class SnapshotDataStoreDaoImpl extends GenericDaoBase implements VolumeDataStoreDao { +public class SnapshotDataStoreDaoImpl extends GenericDaoBase implements SnapshotDataStoreDao { private static final Logger s_logger = Logger.getLogger(SnapshotDataStoreDaoImpl.class); - private SearchBuilder updateStateSearch; + private SearchBuilder updateStateSearch; + private SearchBuilder storeSearch; + private SearchBuilder liveStoreSearch; + @Override public boolean configure(String name, Map params) throws ConfigurationException { super.configure(name, params); + storeSearch = createSearchBuilder(); + storeSearch.and("store_id", storeSearch.entity().getDataStoreId(), SearchCriteria.Op.EQ); + storeSearch.done(); + + liveStoreSearch = createSearchBuilder(); + liveStoreSearch.and("store_id", storeSearch.entity().getDataStoreId(), SearchCriteria.Op.EQ); + liveStoreSearch.and("destroyed", storeSearch.entity().getDestroyed(), SearchCriteria.Op.EQ); + liveStoreSearch.done(); + updateStateSearch = this.createSearchBuilder(); updateStateSearch.and("id", updateStateSearch.entity().getId(), Op.EQ); updateStateSearch.and("state", updateStateSearch.entity().getState(), Op.EQ); @@ -47,14 +63,15 @@ public class SnapshotDataStoreDaoImpl extends GenericDaoBase sc = updateStateSearch.create(); + SearchCriteria sc = updateStateSearch.create(); sc.setParameters("id", dataObj.getId()); sc.setParameters("state", currentState); sc.setParameters("updatedCount", dataObj.getUpdatedCount()); @@ -67,7 +84,7 @@ public class SnapshotDataStoreDaoImpl extends GenericDaoBase listLiveByStoreId(long id) { + SearchCriteria sc = storeSearch.create(); + sc.setParameters("store_id", id); + sc.setParameters("destroyed", false); + return listIncludingRemovedBy(sc); + } + + @Override + public void deletePrimaryRecordsForStore(long id) { + SearchCriteria sc = storeSearch.create(); + sc.setParameters("store_id", id); + Transaction txn = Transaction.currentTxn(); + txn.start(); + remove(sc); + txn.commit(); + } + + + } diff --git a/engine/storage/src/org/apache/cloudstack/storage/db/TemplateDataStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java similarity index 70% rename from engine/storage/src/org/apache/cloudstack/storage/db/TemplateDataStoreDaoImpl.java rename to engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java index c40b8ba0cd3..2066c5d7c6f 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/db/TemplateDataStoreDaoImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java @@ -14,8 +14,9 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package org.apache.cloudstack.storage.db; +package org.apache.cloudstack.storage.image.db; import java.util.Date; +import java.util.List; import java.util.Map; import javax.naming.ConfigurationException; @@ -23,12 +24,16 @@ import javax.naming.ConfigurationException; import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore; import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event; import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State; +import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO; +import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao; +import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; +import com.cloud.utils.db.Transaction; import com.cloud.utils.db.SearchCriteria.Op; import com.cloud.utils.db.UpdateBuilder; @@ -36,17 +41,30 @@ import com.cloud.utils.db.UpdateBuilder; public class TemplateDataStoreDaoImpl extends GenericDaoBase implements TemplateDataStoreDao { private static final Logger s_logger = Logger.getLogger(TemplateDataStoreDaoImpl.class); private SearchBuilder updateStateSearch; + private SearchBuilder storeSearch; + private SearchBuilder liveStoreSearch; + @Override public boolean configure(String name, Map params) throws ConfigurationException { super.configure(name, params); - updateStateSearch = this.createSearchBuilder(); + storeSearch = createSearchBuilder(); + storeSearch.and("store_id", storeSearch.entity().getDataStoreId(), SearchCriteria.Op.EQ); + storeSearch.done(); + + liveStoreSearch = createSearchBuilder(); + liveStoreSearch.and("store_id", storeSearch.entity().getDataStoreId(), SearchCriteria.Op.EQ); + liveStoreSearch.and("destroyed", storeSearch.entity().getDestroyed(), SearchCriteria.Op.EQ); + liveStoreSearch.done(); + + updateStateSearch = this.createSearchBuilder(); updateStateSearch.and("id", updateStateSearch.entity().getId(), Op.EQ); updateStateSearch.and("state", updateStateSearch.entity().getState(), Op.EQ); updateStateSearch.and("updatedCount", updateStateSearch.entity().getUpdatedCount(), Op.EQ); updateStateSearch.done(); return true; } + @Override public boolean updateState(State currentState, Event event, State nextState, TemplateDataStoreVO dataObj, Object data) { @@ -83,4 +101,27 @@ public class TemplateDataStoreDaoImpl extends GenericDaoBase 0; } + @Override + public List listByStoreId(long id) { + SearchCriteria sc = storeSearch.create(); + sc.setParameters("store_id", id); + return listIncludingRemovedBy(sc); + } + @Override + public List listLiveByStoreId(long id) { + SearchCriteria sc = storeSearch.create(); + sc.setParameters("store_id", id); + sc.setParameters("destroyed", false); + return listIncludingRemovedBy(sc); + } + + @Override + public void deletePrimaryRecordsForStore(long id) { + SearchCriteria sc = storeSearch.create(); + sc.setParameters("store_id", id); + Transaction txn = Transaction.currentTxn(); + txn.start(); + remove(sc); + txn.commit(); + } } diff --git a/engine/storage/src/org/apache/cloudstack/storage/db/VolumeDataStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java similarity index 76% rename from engine/storage/src/org/apache/cloudstack/storage/db/VolumeDataStoreDaoImpl.java rename to engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java index 1f7b278d9bf..34de3f249b4 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/db/VolumeDataStoreDaoImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java @@ -14,8 +14,9 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package org.apache.cloudstack.storage.db; +package org.apache.cloudstack.storage.image.db; import java.util.Date; +import java.util.List; import java.util.Map; import javax.naming.ConfigurationException; @@ -23,12 +24,17 @@ import javax.naming.ConfigurationException; import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore; import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event; import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State; +import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO; +import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO; +import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao; +import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; +import com.cloud.utils.db.Transaction; import com.cloud.utils.db.SearchCriteria.Op; import com.cloud.utils.db.UpdateBuilder; @@ -36,6 +42,9 @@ import com.cloud.utils.db.UpdateBuilder; public class VolumeDataStoreDaoImpl extends GenericDaoBase implements VolumeDataStoreDao { private static final Logger s_logger = Logger.getLogger(VolumeDataStoreDaoImpl.class); private SearchBuilder updateStateSearch; + private SearchBuilder storeSearch; + private SearchBuilder liveStoreSearch; + @Override public boolean configure(String name, Map params) throws ConfigurationException { super.configure(name, params); @@ -83,4 +92,27 @@ public class VolumeDataStoreDaoImpl extends GenericDaoBase 0; } + @Override + public List listByStoreId(long id) { + SearchCriteria sc = storeSearch.create(); + sc.setParameters("store_id", id); + return listIncludingRemovedBy(sc); + } + @Override + public List listLiveByStoreId(long id) { + SearchCriteria sc = storeSearch.create(); + sc.setParameters("store_id", id); + sc.setParameters("destroyed", false); + return listIncludingRemovedBy(sc); + } + + @Override + public void deletePrimaryRecordsForStore(long id) { + SearchCriteria sc = storeSearch.create(); + sc.setParameters("store_id", id); + Transaction txn = Transaction.currentTxn(); + txn.start(); + remove(sc); + txn.commit(); + } } diff --git a/engine/api/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDetailsDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/volume/db/PrimaryDataStoreDetailsDaoImpl.java similarity index 92% rename from engine/api/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDetailsDaoImpl.java rename to engine/storage/src/org/apache/cloudstack/storage/volume/db/PrimaryDataStoreDetailsDaoImpl.java index 59c488cf6d4..b0a387a0fbb 100644 --- a/engine/api/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDetailsDaoImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/volume/db/PrimaryDataStoreDetailsDaoImpl.java @@ -14,11 +14,14 @@ // 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; +package org.apache.cloudstack.storage.volume.db; import java.util.HashMap; import java.util.List; import java.util.Map; + +import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDetailVO; +import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDetailsDao; import org.springframework.stereotype.Component; import com.cloud.utils.db.GenericDaoBase; diff --git a/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackImageStoreLifeCycleImpl.java b/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackImageStoreLifeCycleImpl.java index fbd9909150a..922205a5ff8 100644 --- a/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackImageStoreLifeCycleImpl.java +++ b/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackImageStoreLifeCycleImpl.java @@ -29,10 +29,10 @@ import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.HostScope; import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope; +import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; +import org.apache.cloudstack.storage.datastore.db.ImageStoreVO; import org.apache.cloudstack.storage.image.datastore.ImageStoreHelper; import org.apache.cloudstack.storage.image.datastore.ImageStoreProviderManager; -import org.apache.cloudstack.storage.image.db.ImageStoreDao; -import org.apache.cloudstack.storage.image.db.ImageStoreVO; import org.apache.cloudstack.storage.image.store.lifecycle.ImageStoreLifeCycle; import org.apache.log4j.Logger; diff --git a/plugins/storage/image/s3/src/org/apache/cloudstack/storage/datastore/lifecycle/S3ImageStoreLifeCycleImpl.java b/plugins/storage/image/s3/src/org/apache/cloudstack/storage/datastore/lifecycle/S3ImageStoreLifeCycleImpl.java index 7d22df5006b..c3843560296 100644 --- a/plugins/storage/image/s3/src/org/apache/cloudstack/storage/datastore/lifecycle/S3ImageStoreLifeCycleImpl.java +++ b/plugins/storage/image/s3/src/org/apache/cloudstack/storage/datastore/lifecycle/S3ImageStoreLifeCycleImpl.java @@ -30,10 +30,10 @@ import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.HostScope; import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope; +import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; +import org.apache.cloudstack.storage.datastore.db.ImageStoreVO; import org.apache.cloudstack.storage.image.datastore.ImageStoreHelper; import org.apache.cloudstack.storage.image.datastore.ImageStoreProviderManager; -import org.apache.cloudstack.storage.image.db.ImageStoreDao; -import org.apache.cloudstack.storage.image.db.ImageStoreVO; import org.apache.cloudstack.storage.image.store.lifecycle.ImageStoreLifeCycle; import org.apache.log4j.Logger; diff --git a/plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/lifecycle/SampleImageStoreLifeCycleImpl.java b/plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/lifecycle/SampleImageStoreLifeCycleImpl.java index 8c61f036a16..fbe9f196a9f 100644 --- a/plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/lifecycle/SampleImageStoreLifeCycleImpl.java +++ b/plugins/storage/image/sample/src/org/apache/cloudstack/storage/datastore/lifecycle/SampleImageStoreLifeCycleImpl.java @@ -24,10 +24,10 @@ import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.HostScope; import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope; +import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; +import org.apache.cloudstack.storage.datastore.db.ImageStoreVO; import org.apache.cloudstack.storage.image.datastore.ImageStoreHelper; import org.apache.cloudstack.storage.image.datastore.ImageStoreProviderManager; -import org.apache.cloudstack.storage.image.db.ImageStoreDao; -import org.apache.cloudstack.storage.image.db.ImageStoreVO; import org.apache.cloudstack.storage.image.store.lifecycle.ImageStoreLifeCycle; import com.cloud.agent.api.StoragePoolInfo; diff --git a/plugins/storage/image/swift/src/org/apache/cloudstack/storage/datastore/lifecycle/SwiftImageStoreLifeCycleImpl.java b/plugins/storage/image/swift/src/org/apache/cloudstack/storage/datastore/lifecycle/SwiftImageStoreLifeCycleImpl.java index 62dbfaebce8..799d4e0812c 100644 --- a/plugins/storage/image/swift/src/org/apache/cloudstack/storage/datastore/lifecycle/SwiftImageStoreLifeCycleImpl.java +++ b/plugins/storage/image/swift/src/org/apache/cloudstack/storage/datastore/lifecycle/SwiftImageStoreLifeCycleImpl.java @@ -29,10 +29,10 @@ import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.HostScope; import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope; +import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; +import org.apache.cloudstack.storage.datastore.db.ImageStoreVO; import org.apache.cloudstack.storage.image.datastore.ImageStoreHelper; import org.apache.cloudstack.storage.image.datastore.ImageStoreProviderManager; -import org.apache.cloudstack.storage.image.db.ImageStoreDao; -import org.apache.cloudstack.storage.image.db.ImageStoreVO; import org.apache.cloudstack.storage.image.store.lifecycle.ImageStoreLifeCycle; import org.apache.log4j.Logger; diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index 88b1a520dd6..c9f97be2a81 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -64,8 +64,17 @@ import org.apache.cloudstack.engine.subsystem.api.storage.VolumeService; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeService.VolumeApiResult; import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope; import org.apache.cloudstack.framework.async.AsyncCallFuture; +import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; +import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao; +import org.apache.cloudstack.storage.datastore.db.ImageStoreVO; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; +import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao; +import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO; import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; +import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao; +import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO; +import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao; +import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; @@ -78,6 +87,7 @@ import com.cloud.agent.api.ManageSnapshotCommand; import com.cloud.agent.api.StoragePoolInfo; import com.cloud.agent.api.storage.DeleteTemplateCommand; import com.cloud.agent.api.storage.DeleteVolumeCommand; +import com.cloud.agent.manager.AgentAttache; import com.cloud.agent.manager.Commands; import com.cloud.alert.AlertManager; import com.cloud.api.ApiDBUtils; @@ -125,6 +135,7 @@ import com.cloud.org.Grouping; import com.cloud.org.Grouping.AllocationState; import com.cloud.resource.ResourceManager; import com.cloud.resource.ResourceState; +import com.cloud.resource.ResourceStateAdapter; import com.cloud.server.ManagementServer; import com.cloud.server.StatsCollector; import com.cloud.service.dao.ServiceOfferingDao; @@ -175,6 +186,7 @@ import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.SearchCriteria.Op; import com.cloud.utils.db.Transaction; import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.utils.fsm.NoTransitionException; import com.cloud.vm.DiskProfile; import com.cloud.vm.UserVmManager; import com.cloud.vm.VMInstanceVO; @@ -243,6 +255,16 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C @Inject protected PrimaryDataStoreDao _storagePoolDao = null; @Inject + protected ImageStoreDao _imageStoreDao = null; + @Inject + protected ImageStoreDetailsDao _imageStoreDetailsDao = null; + @Inject + protected SnapshotDataStoreDao _snapshotStoreDao = null; + @Inject + protected TemplateDataStoreDao _templateStoreDao = null; + @Inject + protected VolumeDataStoreDao _volumeStoreDao = null; + @Inject protected CapacityDao _capacityDao; @Inject protected CapacityManager _capacityMgr; @@ -1949,10 +1971,44 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C return (ImageStore) _dataStoreMgr.getDataStore(store.getId(), DataStoreRole.Image); } + @Override public boolean deleteImageStore(DeleteImageStoreCmd cmd) { - // TODO Auto-generated method stub - return false; + long storeId = cmd.getId(); + User caller = _accountMgr.getActiveUser(UserContext.current().getCallerUserId()); + // Verify that image store exists + ImageStoreVO store = _imageStoreDao.findById(storeId); + if (store == null) { + throw new InvalidParameterValueException("Image store with id " + storeId + " doesn't exist"); + } + _accountMgr.checkAccessAndSpecifyAuthority(UserContext.current().getCaller(), store.getDataCenterId()); + + // Verify that there are no live snapshot, template, volume on the image store to be deleted + List snapshots = _snapshotStoreDao.listLiveByStoreId(storeId); + if ( snapshots != null && snapshots.size() > 0 ){ + throw new CloudRuntimeException("Cannot delete image store with active snapshots backup!"); + } + List volumes = _volumeStoreDao.listLiveByStoreId(storeId); + if ( volumes != null && volumes.size() > 0 ){ + throw new CloudRuntimeException("Cannot delete image store with active volumes backup!"); + } + List templates = _templateStoreDao.listLiveByStoreId(storeId); + if ( templates != null && templates.size() > 0 ){ + throw new CloudRuntimeException("Cannot delete image store with active templates backup!"); + } + + // ready to delete + Transaction txn = Transaction.currentTxn(); + txn.start(); + // first delete from image_store_details table, we need to do that since we are not actually deleting record from main + // image_data_store table, so delete cascade will not work + _imageStoreDetailsDao.deleteDetails(storeId); + _snapshotStoreDao.deletePrimaryRecordsForStore(storeId); + _volumeStoreDao.deletePrimaryRecordsForStore(storeId); + _templateStoreDao.deletePrimaryRecordsForStore(storeId); + _imageStoreDao.remove(storeId); + txn.commit(); + return true; }