Handle the case where a snapshot is associated with a deleted volume

This commit is contained in:
Mike Tutkowski 2014-11-06 15:34:39 -07:00
parent 455ffc3342
commit 92d9ef9c17
2 changed files with 10 additions and 6 deletions

View File

@ -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.ImageStoreDao;
import org.apache.cloudstack.storage.datastore.db.ImageStoreVO; import org.apache.cloudstack.storage.datastore.db.ImageStoreVO;
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; 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 org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
import com.cloud.agent.AgentManager; import com.cloud.agent.AgentManager;
@ -101,8 +100,6 @@ public class EndpointSelectorTest {
@Inject @Inject
PrimaryDataStoreProvider primaryDataStoreProvider; PrimaryDataStoreProvider primaryDataStoreProvider;
@Inject @Inject
SnapshotDataStoreDao snapshotDataStoreDao;
@Inject
VolumeDao volumeDao; VolumeDao volumeDao;
@Inject @Inject
VolumeService volumeService; VolumeService volumeService;

View File

@ -149,6 +149,8 @@ import org.apache.cloudstack.network.lb.ApplicationLoadBalancerRule;
import org.apache.cloudstack.region.PortableIp; import org.apache.cloudstack.region.PortableIp;
import org.apache.cloudstack.region.PortableIpRange; import org.apache.cloudstack.region.PortableIpRange;
import org.apache.cloudstack.region.Region; 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.Usage;
import org.apache.cloudstack.usage.UsageService; import org.apache.cloudstack.usage.UsageService;
import org.apache.cloudstack.usage.UsageTypes; import org.apache.cloudstack.usage.UsageTypes;
@ -330,6 +332,8 @@ public class ApiResponseHelper implements ResponseGenerator {
private VolumeDao _volumeDao; private VolumeDao _volumeDao;
@Inject @Inject
private DataStoreManager _dataStoreMgr; private DataStoreManager _dataStoreMgr;
@Inject
SnapshotDataStoreDao _snapshotStoreDao;
@Override @Override
public UserResponse createUserResponse(User user) { public UserResponse createUserResponse(User user) {
@ -497,10 +501,13 @@ public class ApiResponseHelper implements ResponseGenerator {
} }
private DataStoreRole getDataStoreRole(Snapshot snapshot) { private DataStoreRole getDataStoreRole(Snapshot snapshot) {
long volumeId = snapshot.getVolumeId(); SnapshotDataStoreVO snapshotStore = _snapshotStoreDao.findBySnapshot(snapshot.getId(), DataStoreRole.Primary);
VolumeVO volumeVO = _volumeDao.findById(volumeId);
long storagePoolId = volumeVO.getPoolId(); if (snapshotStore == null) {
return DataStoreRole.Image;
}
long storagePoolId = snapshotStore.getDataStoreId();
DataStore dataStore = _dataStoreMgr.getDataStore(storagePoolId, DataStoreRole.Primary); DataStore dataStore = _dataStoreMgr.getDataStore(storagePoolId, DataStoreRole.Primary);
Map<String, String> mapCapabilities = dataStore.getDriver().getCapabilities(); Map<String, String> mapCapabilities = dataStore.getDriver().getCapabilities();