diff --git a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java index b59c8d018ee..170f092ecc3 100644 --- a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java @@ -3269,10 +3269,9 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati DiskOfferingVO diskOffering = null; if (diskOfferingId == null) { - diskOffering = createDiskOfferingInternal(userId, isSystem, vmType, - name, cpu, ramSize, speed, displayText, typedProvisioningType, localStorageRequired, - offerHA, limitResourceUse, volatileVm, tags, domainIds, zoneIds, hostTag, - networkRate, deploymentPlanner, details, rootDiskSizeInGiB, isCustomizedIops, minIops, maxIops, + diskOffering = createDiskOfferingInternal( + name, displayText, typedProvisioningType, localStorageRequired, + tags, details, rootDiskSizeInGiB, isCustomizedIops, minIops, maxIops, bytesReadRate, bytesReadRateMax, bytesReadRateMaxLength, bytesWriteRate, bytesWriteRateMax, bytesWriteRateMaxLength, iopsReadRate, iopsReadRateMax, iopsReadRateMaxLength, @@ -3280,6 +3279,10 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati hypervisorSnapshotReserve, cacheMode, storagePolicyID, encryptRoot); } else { diskOffering = _diskOfferingDao.findById(diskOfferingId); + String diskStoragePolicyId = diskOfferingDetailsDao.getDetail(diskOfferingId, ApiConstants.STORAGE_POLICY); + if (storagePolicyID != null && diskStoragePolicyId != null) { + throw new InvalidParameterValueException("Storage policy cannot be defined on both compute and disk offering"); + } } if (diskOffering != null) { serviceOffering.setDiskOfferingId(diskOffering.getId()); @@ -3319,10 +3322,8 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati } } - private DiskOfferingVO createDiskOfferingInternal(final long userId, final boolean isSystem, final VirtualMachine.Type vmType, - final String name, final Integer cpu, final Integer ramSize, final Integer speed, final String displayText, final ProvisioningType typedProvisioningType, final boolean localStorageRequired, - final boolean offerHA, final boolean limitResourceUse, final boolean volatileVm, String tags, final List domainIds, List zoneIds, final String hostTag, - final Integer networkRate, final String deploymentPlanner, final Map details, Long rootDiskSizeInGiB, final Boolean isCustomizedIops, Long minIops, Long maxIops, + private DiskOfferingVO createDiskOfferingInternal(final String name, final String displayText, final ProvisioningType typedProvisioningType, final boolean localStorageRequired, + String tags, final Map details, Long rootDiskSizeInGiB, final Boolean isCustomizedIops, Long minIops, Long maxIops, Long bytesReadRate, Long bytesReadRateMax, Long bytesReadRateMaxLength, Long bytesWriteRate, Long bytesWriteRateMax, Long bytesWriteRateMaxLength, Long iopsReadRate, Long iopsReadRateMax, Long iopsReadRateMaxLength, @@ -3383,8 +3384,8 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati diskOffering.setHypervisorSnapshotReserve(hypervisorSnapshotReserve); if ((diskOffering = _diskOfferingDao.persist(diskOffering)) != null) { - if (details != null && !details.isEmpty()) { - List diskDetailsVO = new ArrayList(); + if ((details != null && !details.isEmpty()) || (storagePolicyID != null)) { + List diskDetailsVO = new ArrayList<>(); // Support disk offering details for below parameters if (details.containsKey(Volume.BANDWIDTH_LIMIT_IN_MBPS)) { diskDetailsVO.add(new DiskOfferingDetailVO(diskOffering.getId(), Volume.BANDWIDTH_LIMIT_IN_MBPS, details.get(Volume.BANDWIDTH_LIMIT_IN_MBPS), false)); @@ -3392,6 +3393,11 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati if (details.containsKey(Volume.IOPS_LIMIT)) { diskDetailsVO.add(new DiskOfferingDetailVO(diskOffering.getId(), Volume.IOPS_LIMIT, details.get(Volume.IOPS_LIMIT), false)); } + + if (storagePolicyID != null) { + diskDetailsVO.add(new DiskOfferingDetailVO(diskOffering.getId(), ApiConstants.STORAGE_POLICY, String.valueOf(storagePolicyID), false)); + } + if (!diskDetailsVO.isEmpty()) { diskOfferingDetailsDao.saveDetails(diskDetailsVO); } diff --git a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java index 3f5054bc0e8..fd6813d9d38 100644 --- a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java @@ -2824,18 +2824,9 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C List> answers = new ArrayList>(); for (Pair volumeDiskProfilePair : volumes) { - String storagePolicyId = null; Volume volume = volumeDiskProfilePair.first(); DiskProfile diskProfile = volumeDiskProfilePair.second(); - if (volume.getVolumeType() == Type.ROOT) { - Long vmId = volume.getInstanceId(); - if (vmId != null) { - VMInstanceVO vm = _vmInstanceDao.findByIdIncludingRemoved(vmId); - storagePolicyId = _serviceOfferingDetailsDao.getDetail(vm.getServiceOfferingId(), ApiConstants.STORAGE_POLICY); - } - } else { - storagePolicyId = _diskOfferingDetailsDao.getDetail(diskProfile.getDiskOfferingId(), ApiConstants.STORAGE_POLICY); - } + String storagePolicyId = _diskOfferingDetailsDao.getDetail(diskProfile.getDiskOfferingId(), ApiConstants.STORAGE_POLICY); if (StringUtils.isNotEmpty(storagePolicyId)) { VsphereStoragePolicyVO storagePolicyVO = _vsphereStoragePolicyDao.findById(Long.parseLong(storagePolicyId)); List hostIds = getUpHostsInPool(pool.getId());