Skip to content

Commit 6edcf32

Browse files
Fix vsphere storage policy when compute offering uses the disk offering attached to it (#9203)
1 parent acae5c5 commit 6edcf32

2 files changed

Lines changed: 17 additions & 20 deletions

File tree

server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3269,17 +3269,20 @@ protected ServiceOfferingVO createServiceOffering(final long userId, final boole
32693269

32703270
DiskOfferingVO diskOffering = null;
32713271
if (diskOfferingId == null) {
3272-
diskOffering = createDiskOfferingInternal(userId, isSystem, vmType,
3273-
name, cpu, ramSize, speed, displayText, typedProvisioningType, localStorageRequired,
3274-
offerHA, limitResourceUse, volatileVm, tags, domainIds, zoneIds, hostTag,
3275-
networkRate, deploymentPlanner, details, rootDiskSizeInGiB, isCustomizedIops, minIops, maxIops,
3272+
diskOffering = createDiskOfferingInternal(
3273+
name, displayText, typedProvisioningType, localStorageRequired,
3274+
tags, details, rootDiskSizeInGiB, isCustomizedIops, minIops, maxIops,
32763275
bytesReadRate, bytesReadRateMax, bytesReadRateMaxLength,
32773276
bytesWriteRate, bytesWriteRateMax, bytesWriteRateMaxLength,
32783277
iopsReadRate, iopsReadRateMax, iopsReadRateMaxLength,
32793278
iopsWriteRate, iopsWriteRateMax, iopsWriteRateMaxLength,
32803279
hypervisorSnapshotReserve, cacheMode, storagePolicyID, encryptRoot);
32813280
} else {
32823281
diskOffering = _diskOfferingDao.findById(diskOfferingId);
3282+
String diskStoragePolicyId = diskOfferingDetailsDao.getDetail(diskOfferingId, ApiConstants.STORAGE_POLICY);
3283+
if (storagePolicyID != null && diskStoragePolicyId != null) {
3284+
throw new InvalidParameterValueException("Storage policy cannot be defined on both compute and disk offering");
3285+
}
32833286
}
32843287
if (diskOffering != null) {
32853288
serviceOffering.setDiskOfferingId(diskOffering.getId());
@@ -3319,10 +3322,8 @@ public void validateExtraConfigInServiceOfferingDetail(String detailName) {
33193322
}
33203323
}
33213324

3322-
private DiskOfferingVO createDiskOfferingInternal(final long userId, final boolean isSystem, final VirtualMachine.Type vmType,
3323-
final String name, final Integer cpu, final Integer ramSize, final Integer speed, final String displayText, final ProvisioningType typedProvisioningType, final boolean localStorageRequired,
3324-
final boolean offerHA, final boolean limitResourceUse, final boolean volatileVm, String tags, final List<Long> domainIds, List<Long> zoneIds, final String hostTag,
3325-
final Integer networkRate, final String deploymentPlanner, final Map<String, String> details, Long rootDiskSizeInGiB, final Boolean isCustomizedIops, Long minIops, Long maxIops,
3325+
private DiskOfferingVO createDiskOfferingInternal(final String name, final String displayText, final ProvisioningType typedProvisioningType, final boolean localStorageRequired,
3326+
String tags, final Map<String, String> details, Long rootDiskSizeInGiB, final Boolean isCustomizedIops, Long minIops, Long maxIops,
33263327
Long bytesReadRate, Long bytesReadRateMax, Long bytesReadRateMaxLength,
33273328
Long bytesWriteRate, Long bytesWriteRateMax, Long bytesWriteRateMaxLength,
33283329
Long iopsReadRate, Long iopsReadRateMax, Long iopsReadRateMaxLength,
@@ -3383,15 +3384,20 @@ private DiskOfferingVO createDiskOfferingInternal(final long userId, final boole
33833384
diskOffering.setHypervisorSnapshotReserve(hypervisorSnapshotReserve);
33843385

33853386
if ((diskOffering = _diskOfferingDao.persist(diskOffering)) != null) {
3386-
if (details != null && !details.isEmpty()) {
3387-
List<DiskOfferingDetailVO> diskDetailsVO = new ArrayList<DiskOfferingDetailVO>();
3387+
if ((details != null && !details.isEmpty()) || (storagePolicyID != null)) {
3388+
List<DiskOfferingDetailVO> diskDetailsVO = new ArrayList<>();
33883389
// Support disk offering details for below parameters
33893390
if (details.containsKey(Volume.BANDWIDTH_LIMIT_IN_MBPS)) {
33903391
diskDetailsVO.add(new DiskOfferingDetailVO(diskOffering.getId(), Volume.BANDWIDTH_LIMIT_IN_MBPS, details.get(Volume.BANDWIDTH_LIMIT_IN_MBPS), false));
33913392
}
33923393
if (details.containsKey(Volume.IOPS_LIMIT)) {
33933394
diskDetailsVO.add(new DiskOfferingDetailVO(diskOffering.getId(), Volume.IOPS_LIMIT, details.get(Volume.IOPS_LIMIT), false));
33943395
}
3396+
3397+
if (storagePolicyID != null) {
3398+
diskDetailsVO.add(new DiskOfferingDetailVO(diskOffering.getId(), ApiConstants.STORAGE_POLICY, String.valueOf(storagePolicyID), false));
3399+
}
3400+
33953401
if (!diskDetailsVO.isEmpty()) {
33963402
diskOfferingDetailsDao.saveDetails(diskDetailsVO);
33973403
}

server/src/main/java/com/cloud/storage/StorageManagerImpl.java

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2824,18 +2824,9 @@ public boolean isStoragePoolCompliantWithStoragePolicy(List<Pair<Volume, DiskPro
28242824
List<Pair<Volume, Answer>> answers = new ArrayList<Pair<Volume, Answer>>();
28252825

28262826
for (Pair<Volume, DiskProfile> volumeDiskProfilePair : volumes) {
2827-
String storagePolicyId = null;
28282827
Volume volume = volumeDiskProfilePair.first();
28292828
DiskProfile diskProfile = volumeDiskProfilePair.second();
2830-
if (volume.getVolumeType() == Type.ROOT) {
2831-
Long vmId = volume.getInstanceId();
2832-
if (vmId != null) {
2833-
VMInstanceVO vm = _vmInstanceDao.findByIdIncludingRemoved(vmId);
2834-
storagePolicyId = _serviceOfferingDetailsDao.getDetail(vm.getServiceOfferingId(), ApiConstants.STORAGE_POLICY);
2835-
}
2836-
} else {
2837-
storagePolicyId = _diskOfferingDetailsDao.getDetail(diskProfile.getDiskOfferingId(), ApiConstants.STORAGE_POLICY);
2838-
}
2829+
String storagePolicyId = _diskOfferingDetailsDao.getDetail(diskProfile.getDiskOfferingId(), ApiConstants.STORAGE_POLICY);
28392830
if (StringUtils.isNotEmpty(storagePolicyId)) {
28402831
VsphereStoragePolicyVO storagePolicyVO = _vsphereStoragePolicyDao.findById(Long.parseLong(storagePolicyId));
28412832
List<Long> hostIds = getUpHostsInPool(pool.getId());

0 commit comments

Comments
 (0)