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 <[email protected]>
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) {