From 92d9ef9c1725cc1c50dbcb1570ce0926a61c5b76 Mon Sep 17 00:00:00 2001 From: Mike Tutkowski Date: Thu, 6 Nov 2014 15:34:39 -0700 Subject: [PATCH] Handle the case where a snapshot is associated with a deleted volume --- .../storage/test/EndpointSelectorTest.java | 3 --- server/src/com/cloud/api/ApiResponseHelper.java | 13 ++++++++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/EndpointSelectorTest.java b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/EndpointSelectorTest.java index f81b8fec794..29acf94b545 100644 --- a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/EndpointSelectorTest.java +++ b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/EndpointSelectorTest.java @@ -54,7 +54,6 @@ 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.datastore.db.PrimaryDataStoreDao; -import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao; import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; import com.cloud.agent.AgentManager; @@ -101,8 +100,6 @@ public class EndpointSelectorTest { @Inject PrimaryDataStoreProvider primaryDataStoreProvider; @Inject - SnapshotDataStoreDao snapshotDataStoreDao; - @Inject VolumeDao volumeDao; @Inject VolumeService volumeService; diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index 38784ae556a..4c22127db51 100755 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -149,6 +149,8 @@ import org.apache.cloudstack.network.lb.ApplicationLoadBalancerRule; import org.apache.cloudstack.region.PortableIp; import org.apache.cloudstack.region.PortableIpRange; import org.apache.cloudstack.region.Region; +import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao; +import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO; import org.apache.cloudstack.usage.Usage; import org.apache.cloudstack.usage.UsageService; import org.apache.cloudstack.usage.UsageTypes; @@ -330,6 +332,8 @@ public class ApiResponseHelper implements ResponseGenerator { private VolumeDao _volumeDao; @Inject private DataStoreManager _dataStoreMgr; + @Inject + SnapshotDataStoreDao _snapshotStoreDao; @Override public UserResponse createUserResponse(User user) { @@ -497,10 +501,13 @@ public class ApiResponseHelper implements ResponseGenerator { } private DataStoreRole getDataStoreRole(Snapshot snapshot) { - long volumeId = snapshot.getVolumeId(); - VolumeVO volumeVO = _volumeDao.findById(volumeId); + SnapshotDataStoreVO snapshotStore = _snapshotStoreDao.findBySnapshot(snapshot.getId(), DataStoreRole.Primary); - long storagePoolId = volumeVO.getPoolId(); + if (snapshotStore == null) { + return DataStoreRole.Image; + } + + long storagePoolId = snapshotStore.getDataStoreId(); DataStore dataStore = _dataStoreMgr.getDataStore(storagePoolId, DataStoreRole.Primary); Map mapCapabilities = dataStore.getDriver().getCapabilities();