mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
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:
parent
67860d9f46
commit
38d0274eb4
@ -23,6 +23,7 @@ import java.util.Set;
|
|||||||
|
|
||||||
import javax.inject.Inject;
|
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.DataStore;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
|
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
|
||||||
import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
|
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.ConfigDrive;
|
||||||
import org.apache.cloudstack.storage.configdrive.ConfigDriveBuilder;
|
import org.apache.cloudstack.storage.configdrive.ConfigDriveBuilder;
|
||||||
import org.apache.cloudstack.storage.to.TemplateObjectTO;
|
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 org.apache.log4j.Logger;
|
||||||
|
|
||||||
import com.cloud.agent.AgentManager;
|
import com.cloud.agent.AgentManager;
|
||||||
@ -56,7 +59,6 @@ import com.cloud.offering.NetworkOffering;
|
|||||||
import com.cloud.service.dao.ServiceOfferingDao;
|
import com.cloud.service.dao.ServiceOfferingDao;
|
||||||
import com.cloud.storage.DataStoreRole;
|
import com.cloud.storage.DataStoreRole;
|
||||||
import com.cloud.storage.Storage;
|
import com.cloud.storage.Storage;
|
||||||
import com.cloud.storage.StoragePool;
|
|
||||||
import com.cloud.storage.Volume;
|
import com.cloud.storage.Volume;
|
||||||
import com.cloud.storage.VolumeVO;
|
import com.cloud.storage.VolumeVO;
|
||||||
import com.cloud.storage.dao.GuestOSCategoryDao;
|
import com.cloud.storage.dao.GuestOSCategoryDao;
|
||||||
@ -322,20 +324,11 @@ public class ConfigDriveNetworkElement extends AdapterBase implements NetworkEle
|
|||||||
private DataStore findDataStore(VirtualMachineProfile profile, DeployDestination dest) {
|
private DataStore findDataStore(VirtualMachineProfile profile, DeployDestination dest) {
|
||||||
DataStore dataStore = null;
|
DataStore dataStore = null;
|
||||||
if (VirtualMachineManager.VmConfigDriveOnPrimaryPool.value()) {
|
if (VirtualMachineManager.VmConfigDriveOnPrimaryPool.value()) {
|
||||||
if (dest.getStorageForDisks() != null) {
|
if(MapUtils.isNotEmpty(dest.getStorageForDisks())) {
|
||||||
for (final Volume volume : dest.getStorageForDisks().keySet()) {
|
dataStore = getPlannedDataStore(dest, dataStore);
|
||||||
if (volume.getVolumeType() == Volume.Type.ROOT) {
|
|
||||||
final StoragePool primaryPool = dest.getStorageForDisks().get(volume);
|
|
||||||
dataStore = _dataStoreMgr.getDataStore(primaryPool.getId(), DataStoreRole.Primary);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (dataStore == null) {
|
if (dataStore == null) {
|
||||||
final List<VolumeVO> volumes = _volumeDao.findByInstanceAndType(profile.getVirtualMachine().getId(), Volume.Type.ROOT);
|
dataStore = pickExistingRootVolumeFromDataStore(profile, dataStore);
|
||||||
if (volumes != null && volumes.size() > 0) {
|
|
||||||
dataStore = _dataStoreMgr.getDataStore(volumes.get(0).getPoolId(), DataStoreRole.Primary);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
dataStore = _dataStoreMgr.getImageStore(dest.getDataCenter().getId());
|
dataStore = _dataStoreMgr.getImageStore(dest.getDataCenter().getId());
|
||||||
@ -343,6 +336,66 @@ public class ConfigDriveNetworkElement extends AdapterBase implements NetworkEle
|
|||||||
return dataStore;
|
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 {
|
private Long findAgentIdForImageStore(final DataStore dataStore) throws ResourceUnavailableException {
|
||||||
EndPoint endpoint = _ep.select(dataStore);
|
EndPoint endpoint = _ep.select(dataStore);
|
||||||
if (endpoint == null) {
|
if (endpoint == null) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user