From 888ef5e3f6d56a7d75b470d799220b40a6c432b6 Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Tue, 15 Feb 2022 11:05:03 +0530 Subject: [PATCH 1/3] Allow scaling VM to a service offering with different storage tags --- .../java/com/cloud/vm/VirtualMachineManagerImpl.java | 9 ++++++--- .../java/com/cloud/storage/VolumeApiServiceImpl.java | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java index 477c42a19199..1dd7360d8903 100755 --- a/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java @@ -45,6 +45,7 @@ import javax.naming.ConfigurationException; import javax.persistence.EntityExistsException; +import com.cloud.storage.VolumeApiServiceImpl; import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao; import org.apache.cloudstack.annotation.AnnotationService; import org.apache.cloudstack.annotation.dao.AnnotationDao; @@ -3765,9 +3766,11 @@ public void checkIfCanUpgrade(final VirtualMachine vmInstance, final ServiceOffe final List currentTags = StringUtils.csvTagsToList(currentDiskOffering.getTags()); final List newTags = StringUtils.csvTagsToList(newDiskOffering.getTags()); - if (!newTags.containsAll(currentTags)) { - throw new InvalidParameterValueException("Unable to upgrade virtual machine; the current service offering " + " should have tags as subset of " + - "the new service offering tags. Current service offering tags: " + currentTags + "; " + "new service " + "offering tags: " + newTags); + if (VolumeApiServiceImpl.MatchStoragePoolTagsWithDiskOffering.valueIn(vmInstance.getDataCenterId())) { + if (!VolumeApiServiceImpl.doesNewDiskOfferingHasTagsAsOldDiskOffering(currentDiskOffering, newDiskOffering)) { + throw new InvalidParameterValueException("Unable to upgrade virtual machine; the current service offering " + " should have tags as subset of " + + "the new service offering tags. Current service offering tags: " + currentTags + "; " + "new service " + "offering tags: " + newTags); + } } } diff --git a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java index 3bee5df955da..7f07d14cb170 100644 --- a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java +++ b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java @@ -3049,7 +3049,7 @@ public boolean doesTargetStorageSupportDiskOffering(StoragePool destPool, String return CollectionUtils.isSubCollection(Arrays.asList(newDiskOfferingTagsAsStringArray), Arrays.asList(storageTagsAsStringArray)); } - public boolean doesNewDiskOfferingHasTagsAsOldDiskOffering(DiskOfferingVO oldDO, DiskOfferingVO newDO) { + public static boolean doesNewDiskOfferingHasTagsAsOldDiskOffering(DiskOfferingVO oldDO, DiskOfferingVO newDO) { String[] oldDOStorageTags = oldDO.getTagsArray(); String[] newDOStorageTags = newDO.getTagsArray(); if (oldDOStorageTags.length == 0) { From b9aa90652158c260ed0de3a51ede771eb37b1c42 Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Tue, 15 Feb 2022 12:26:24 +0530 Subject: [PATCH 2/3] list svc offerings with other stg tags when global setting is disabled --- server/src/main/java/com/cloud/api/query/QueryManagerImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java index d6a3ab6474a1..0ae776bddef2 100644 --- a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java @@ -3267,7 +3267,7 @@ private Pair, Integer> searchForServiceOfferingsInte if (currentVmOffering != null) { DiskOfferingVO diskOffering = _diskOfferingDao.findByIdIncludingRemoved(currentVmOffering.getDiskOfferingId()); List storageTags = com.cloud.utils.StringUtils.csvTagsToList(diskOffering.getTags()); - if (!storageTags.isEmpty()) { + if (!storageTags.isEmpty() && VolumeApiServiceImpl.MatchStoragePoolTagsWithDiskOffering.value()) { SearchBuilder sb = _srvOfferingJoinDao.createSearchBuilder(); for(String tag : storageTags) { sb.and(tag, sb.entity().getTags(), Op.FIND_IN_SET); From ba8b6bd31ca62359e9e8b3f80c0b1e6425bc2f15 Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Fri, 18 Feb 2022 12:11:47 +0530 Subject: [PATCH 3/3] remove check for size when disk is compute only --- .../src/main/java/com/cloud/storage/VolumeApiServiceImpl.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java index 7f07d14cb170..25347c09382d 100644 --- a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java +++ b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java @@ -1910,10 +1910,9 @@ private void validateVolumeResizeWithNewDiskOfferingAndLoad(VolumeVO volume, Dis } _configMgr.checkDiskOfferingAccess(_accountMgr.getActiveAccountById(volume.getAccountId()), newDiskOffering, _dcDao.findById(volume.getDataCenterId())); - if (newDiskOffering.getDiskSize() > 0 && !newDiskOffering.isComputeOnly()) { newSize[0] = (Long) newDiskOffering.getDiskSize(); - } else if (newDiskOffering.isCustomized()) { + } else if (newDiskOffering.isCustomized() && !newDiskOffering.isComputeOnly()) { if (newSize[0] == null) { throw new InvalidParameterValueException("The new disk offering requires that a size be specified."); }