check volumes for state when retrieving pool for configDrive creation (#2709)

* only ask for the root volume, removing extensive query

* better name
This commit is contained in:
dahn 2018-07-18 13:13:41 +02:00 committed by GitHub
parent 67860d9f46
commit 38d0274eb4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -23,6 +23,7 @@ import java.util.Set;
import javax.inject.Inject;
import com.cloud.storage.StoragePool;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
@ -30,6 +31,8 @@ import org.apache.cloudstack.engine.subsystem.api.storage.EndPointSelector;
import org.apache.cloudstack.storage.configdrive.ConfigDrive;
import org.apache.cloudstack.storage.configdrive.ConfigDriveBuilder;
import org.apache.cloudstack.storage.to.TemplateObjectTO;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.apache.log4j.Logger;
import com.cloud.agent.AgentManager;
@ -56,7 +59,6 @@ import com.cloud.offering.NetworkOffering;
import com.cloud.service.dao.ServiceOfferingDao;
import com.cloud.storage.DataStoreRole;
import com.cloud.storage.Storage;
import com.cloud.storage.StoragePool;
import com.cloud.storage.Volume;
import com.cloud.storage.VolumeVO;
import com.cloud.storage.dao.GuestOSCategoryDao;
@ -322,20 +324,11 @@ public class ConfigDriveNetworkElement extends AdapterBase implements NetworkEle
private DataStore findDataStore(VirtualMachineProfile profile, DeployDestination dest) {
DataStore dataStore = null;
if (VirtualMachineManager.VmConfigDriveOnPrimaryPool.value()) {
if (dest.getStorageForDisks() != null) {
for (final Volume volume : dest.getStorageForDisks().keySet()) {
if (volume.getVolumeType() == Volume.Type.ROOT) {
final StoragePool primaryPool = dest.getStorageForDisks().get(volume);
dataStore = _dataStoreMgr.getDataStore(primaryPool.getId(), DataStoreRole.Primary);
break;
}
}
if(MapUtils.isNotEmpty(dest.getStorageForDisks())) {
dataStore = getPlannedDataStore(dest, dataStore);
}
if (dataStore == null) {
final List<VolumeVO> volumes = _volumeDao.findByInstanceAndType(profile.getVirtualMachine().getId(), Volume.Type.ROOT);
if (volumes != null && volumes.size() > 0) {
dataStore = _dataStoreMgr.getDataStore(volumes.get(0).getPoolId(), DataStoreRole.Primary);
}
dataStore = pickExistingRootVolumeFromDataStore(profile, dataStore);
}
} else {
dataStore = _dataStoreMgr.getImageStore(dest.getDataCenter().getId());
@ -343,6 +336,66 @@ public class ConfigDriveNetworkElement extends AdapterBase implements NetworkEle
return dataStore;
}
private DataStore getPlannedDataStore(DeployDestination dest, DataStore dataStore) {
for (final Volume volume : dest.getStorageForDisks().keySet()) {
if (volume.getVolumeType() == Volume.Type.ROOT) {
final StoragePool primaryPool = dest.getStorageForDisks().get(volume);
dataStore = _dataStoreMgr.getDataStore(primaryPool.getId(), DataStoreRole.Primary);
break;
}
}
return dataStore;
}
private DataStore pickExistingRootVolumeFromDataStore(VirtualMachineProfile profile, DataStore dataStore) {
final List<VolumeVO> volumes = _volumeDao.findByInstanceAndType(profile.getVirtualMachine().getId(), Volume.Type.ROOT);
if (CollectionUtils.isNotEmpty(volumes)) {
dataStore = pickDataStoreFromVolumes(volumes);
}
return dataStore;
}
private DataStore pickDataStoreFromVolumes(List<VolumeVO> volumes) {
DataStore dataStore = null;
for (Volume vol : volumes) {
if (doesVolumeStateCheckout(vol)) {
dataStore = _dataStoreMgr.getDataStore(vol.getPoolId(), DataStoreRole.Primary);
if (dataStore != null) {
return dataStore;
}
}
}
return dataStore;
}
private boolean doesVolumeStateCheckout(Volume vol) {
switch (vol.getState()) {
case Allocated:
case Creating:
case Ready:
case Snapshotting:
case RevertSnapshotting:
case Resizing:
case Copying:
case Attaching:
return true;
case Migrating:
case Expunging:
case Expunged:
case Destroy:
case Destroying:
case UploadOp:
case Uploaded:
case NotUploaded:
case UploadInProgress:
case UploadError:
case UploadAbandoned:
return false;
default:
throw new IllegalArgumentException("volume has a state that does not compute: " +vol.getState());
}
}
private Long findAgentIdForImageStore(final DataStore dataStore) throws ResourceUnavailableException {
EndPoint endpoint = _ep.select(dataStore);
if (endpoint == null) {