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) {

Reply via email to