Merge release branch 4.11 to master

* 4.11:
  register template kvm context ui fix (#2757)
  check volumes for state when retrieving pool for configDrive creation (#2709)
This commit is contained in:
Daan Hoogland 2018-07-20 11:31:53 +00:00
commit c3ff356c15
2 changed files with 67 additions and 14 deletions

View File

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

View File

@ -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');
}