This is an automated email from the ASF dual-hosted git repository. dahn pushed a commit to branch 4.11 in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/4.11 by this push: new 38d0274 check volumes for state when retrieving pool for configDrive creation (#2709) 38d0274 is described below commit 38d0274eb488ffbd9d701d1724bdabb528d7f9ba Author: dahn <daan.hoogl...@gmail.com> AuthorDate: Wed Jul 18 13:13:41 2018 +0200 check volumes for state when retrieving pool for configDrive creation (#2709) * only ask for the root volume, removing extensive query * better name --- .../network/element/ConfigDriveNetworkElement.java | 79 ++++++++++++++++++---- 1 file changed, 66 insertions(+), 13 deletions(-) diff --git a/server/src/com/cloud/network/element/ConfigDriveNetworkElement.java b/server/src/com/cloud/network/element/ConfigDriveNetworkElement.java index 919d7bd..4d2452d 100644 --- a/server/src/com/cloud/network/element/ConfigDriveNetworkElement.java +++ b/server/src/com/cloud/network/element/ConfigDriveNetworkElement.java @@ -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) {