From 38d0274eb488ffbd9d701d1724bdabb528d7f9ba Mon Sep 17 00:00:00 2001 From: dahn Date: Wed, 18 Jul 2018 13:13:41 +0200 Subject: [PATCH 1/2] check volumes for state when retrieving pool for configDrive creation (#2709) * only ask for the root volume, removing extensive query * better name --- .../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 919d7bd9d18..4d2452d45ce 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 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 volumes = _volumeDao.findByInstanceAndType(profile.getVirtualMachine().getId(), Volume.Type.ROOT); + if (CollectionUtils.isNotEmpty(volumes)) { + dataStore = pickDataStoreFromVolumes(volumes); + } + return dataStore; + } + + private DataStore pickDataStoreFromVolumes(List 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) { From 781d6bc0518be45a4feaaf428b0273fdc546fbff Mon Sep 17 00:00:00 2001 From: ernjvr Date: Fri, 20 Jul 2018 09:16:23 +0200 Subject: [PATCH 2/2] register template kvm context ui fix (#2757) On the 'Register Template From URL' screen, when a user selects the KVM option from the Hypervisor dropdown: 1) It incorrectly displays the 'Original XS Version is 6.1' checkbox. This checkbox should be hidden in the KVM context. 2) The 'Root Disk Controller' dropdown should display the default option of 'osdefault' instead of a blank default option. --- ui/scripts/templates.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/scripts/templates.js b/ui/scripts/templates.js index d9d3af0deb0..6dba18b4f96 100755 --- a/ui/scripts/templates.js +++ b/ui/scripts/templates.js @@ -267,7 +267,7 @@ $form.find('.form-item[rel=keyboardType]').hide(); $form.find('.form-item[rel=xenserverToolsVersion61plus]').hide(); $form.find('.form-item[rel=rootDiskControllerTypeKVM]').css('display', 'inline-block'); - $form.find('.form-item[rel=xenserverToolsVersion61plus]').css('display', 'inline-block'); + $('#label_root_disk_controller').prop('selectedIndex', 2); if (isAdmin()) { $form.find('.form-item[rel=directdownload]').css('display', 'inline-block'); }