Skip to content

Commit 38d0274

Browse files
authored
check volumes for state when retrieving pool for configDrive creation (#2709)
* only ask for the root volume, removing extensive query * better name
1 parent 67860d9 commit 38d0274

File tree

1 file changed

+66
-13
lines changed

1 file changed

+66
-13
lines changed

server/src/com/cloud/network/element/ConfigDriveNetworkElement.java

Lines changed: 66 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,16 @@
2323

2424
import javax.inject.Inject;
2525

26+
import com.cloud.storage.StoragePool;
2627
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
2728
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
2829
import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
2930
import org.apache.cloudstack.engine.subsystem.api.storage.EndPointSelector;
3031
import org.apache.cloudstack.storage.configdrive.ConfigDrive;
3132
import org.apache.cloudstack.storage.configdrive.ConfigDriveBuilder;
3233
import org.apache.cloudstack.storage.to.TemplateObjectTO;
34+
import org.apache.commons.collections.CollectionUtils;
35+
import org.apache.commons.collections.MapUtils;
3336
import org.apache.log4j.Logger;
3437

3538
import com.cloud.agent.AgentManager;
@@ -56,7 +59,6 @@
5659
import com.cloud.service.dao.ServiceOfferingDao;
5760
import com.cloud.storage.DataStoreRole;
5861
import com.cloud.storage.Storage;
59-
import com.cloud.storage.StoragePool;
6062
import com.cloud.storage.Volume;
6163
import com.cloud.storage.VolumeVO;
6264
import com.cloud.storage.dao.GuestOSCategoryDao;
@@ -322,27 +324,78 @@ public void commitMigration(NicProfile nic, Network network, VirtualMachineProfi
322324
private DataStore findDataStore(VirtualMachineProfile profile, DeployDestination dest) {
323325
DataStore dataStore = null;
324326
if (VirtualMachineManager.VmConfigDriveOnPrimaryPool.value()) {
325-
if (dest.getStorageForDisks() != null) {
326-
for (final Volume volume : dest.getStorageForDisks().keySet()) {
327-
if (volume.getVolumeType() == Volume.Type.ROOT) {
328-
final StoragePool primaryPool = dest.getStorageForDisks().get(volume);
329-
dataStore = _dataStoreMgr.getDataStore(primaryPool.getId(), DataStoreRole.Primary);
330-
break;
331-
}
332-
}
327+
if(MapUtils.isNotEmpty(dest.getStorageForDisks())) {
328+
dataStore = getPlannedDataStore(dest, dataStore);
333329
}
334330
if (dataStore == null) {
335-
final List<VolumeVO> volumes = _volumeDao.findByInstanceAndType(profile.getVirtualMachine().getId(), Volume.Type.ROOT);
336-
if (volumes != null && volumes.size() > 0) {
337-
dataStore = _dataStoreMgr.getDataStore(volumes.get(0).getPoolId(), DataStoreRole.Primary);
338-
}
331+
dataStore = pickExistingRootVolumeFromDataStore(profile, dataStore);
339332
}
340333
} else {
341334
dataStore = _dataStoreMgr.getImageStore(dest.getDataCenter().getId());
342335
}
343336
return dataStore;
344337
}
345338

339+
private DataStore getPlannedDataStore(DeployDestination dest, DataStore dataStore) {
340+
for (final Volume volume : dest.getStorageForDisks().keySet()) {
341+
if (volume.getVolumeType() == Volume.Type.ROOT) {
342+
final StoragePool primaryPool = dest.getStorageForDisks().get(volume);
343+
dataStore = _dataStoreMgr.getDataStore(primaryPool.getId(), DataStoreRole.Primary);
344+
break;
345+
}
346+
}
347+
return dataStore;
348+
}
349+
350+
private DataStore pickExistingRootVolumeFromDataStore(VirtualMachineProfile profile, DataStore dataStore) {
351+
final List<VolumeVO> volumes = _volumeDao.findByInstanceAndType(profile.getVirtualMachine().getId(), Volume.Type.ROOT);
352+
if (CollectionUtils.isNotEmpty(volumes)) {
353+
dataStore = pickDataStoreFromVolumes(volumes);
354+
}
355+
return dataStore;
356+
}
357+
358+
private DataStore pickDataStoreFromVolumes(List<VolumeVO> volumes) {
359+
DataStore dataStore = null;
360+
for (Volume vol : volumes) {
361+
if (doesVolumeStateCheckout(vol)) {
362+
dataStore = _dataStoreMgr.getDataStore(vol.getPoolId(), DataStoreRole.Primary);
363+
if (dataStore != null) {
364+
return dataStore;
365+
}
366+
}
367+
}
368+
return dataStore;
369+
}
370+
371+
private boolean doesVolumeStateCheckout(Volume vol) {
372+
switch (vol.getState()) {
373+
case Allocated:
374+
case Creating:
375+
case Ready:
376+
case Snapshotting:
377+
case RevertSnapshotting:
378+
case Resizing:
379+
case Copying:
380+
case Attaching:
381+
return true;
382+
case Migrating:
383+
case Expunging:
384+
case Expunged:
385+
case Destroy:
386+
case Destroying:
387+
case UploadOp:
388+
case Uploaded:
389+
case NotUploaded:
390+
case UploadInProgress:
391+
case UploadError:
392+
case UploadAbandoned:
393+
return false;
394+
default:
395+
throw new IllegalArgumentException("volume has a state that does not compute: " +vol.getState());
396+
}
397+
}
398+
346399
private Long findAgentIdForImageStore(final DataStore dataStore) throws ResourceUnavailableException {
347400
EndPoint endpoint = _ep.select(dataStore);
348401
if (endpoint == null) {

0 commit comments

Comments
 (0)