This is an automated email from the ASF dual-hosted git repository.

dahn pushed a commit to branch 4.20
in repository https://gitbox.apache.org/repos/asf/cloudstack.git

commit b025e85fc57b46f4b01b5dd3720fe2c031a2ed81
Author: dahn <[email protected]>
AuthorDate: Fri Feb 20 17:27:15 2026 +0100

    Check resource reservation on volume creation
---
 .../main/java/com/cloud/user/ResourceLimitService.java   |  2 +-
 .../cloud/resourcelimit/ResourceLimitManagerImpl.java    |  3 ++-
 .../java/com/cloud/storage/VolumeApiServiceImpl.java     | 16 ++++++++++++++--
 .../java/com/cloud/vpc/MockResourceLimitManagerImpl.java |  5 +++++
 4 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/api/src/main/java/com/cloud/user/ResourceLimitService.java 
b/api/src/main/java/com/cloud/user/ResourceLimitService.java
index fc486601d16..93609555122 100644
--- a/api/src/main/java/com/cloud/user/ResourceLimitService.java
+++ b/api/src/main/java/com/cloud/user/ResourceLimitService.java
@@ -247,7 +247,7 @@ public interface ResourceLimitService {
     void updateTaggedResourceLimitsAndCountsForAccounts(List<AccountResponse> 
responses, String tag);
     void updateTaggedResourceLimitsAndCountsForDomains(List<DomainResponse> 
responses, String tag);
     void checkVolumeResourceLimit(Account owner, Boolean display, Long size, 
DiskOffering diskOffering) throws ResourceAllocationException;
-
+    List<String> getResourceLimitStorageTagsForResourceCountOperation(Boolean 
display, DiskOffering diskOffering);
     void checkVolumeResourceLimitForDiskOfferingChange(Account owner, Boolean 
display, Long currentSize, Long newSize,
             DiskOffering currentOffering, DiskOffering newOffering) throws 
ResourceAllocationException;
 
diff --git 
a/server/src/main/java/com/cloud/resourcelimit/ResourceLimitManagerImpl.java 
b/server/src/main/java/com/cloud/resourcelimit/ResourceLimitManagerImpl.java
index 01dcd1125da..09a0dda3aaa 100644
--- a/server/src/main/java/com/cloud/resourcelimit/ResourceLimitManagerImpl.java
+++ b/server/src/main/java/com/cloud/resourcelimit/ResourceLimitManagerImpl.java
@@ -1647,7 +1647,8 @@ public class ResourceLimitManagerImpl extends ManagerBase 
implements ResourceLim
         return tags;
     }
 
-    protected List<String> 
getResourceLimitStorageTagsForResourceCountOperation(Boolean display, 
DiskOffering diskOffering) {
+    @Override
+    public List<String> 
getResourceLimitStorageTagsForResourceCountOperation(Boolean display, 
DiskOffering diskOffering) {
         if (Boolean.FALSE.equals(display)) {
             return new ArrayList<>();
         }
diff --git a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java 
b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java
index 4f8b55d16fb..38102619be5 100644
--- a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java
+++ b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java
@@ -35,6 +35,7 @@ import java.util.stream.Collectors;
 
 import javax.inject.Inject;
 
+import com.cloud.resourcelimit.CheckedReservation;
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.ApiErrorCode;
 import org.apache.cloudstack.api.InternalIdentity;
@@ -87,6 +88,7 @@ import org.apache.cloudstack.framework.jobs.impl.AsyncJobVO;
 import org.apache.cloudstack.framework.jobs.impl.OutcomeImpl;
 import org.apache.cloudstack.framework.jobs.impl.VmWorkJobVO;
 import org.apache.cloudstack.jobs.JobInfo;
+import org.apache.cloudstack.reservation.dao.ReservationDao;
 import org.apache.cloudstack.resourcedetail.DiskOfferingDetailVO;
 import org.apache.cloudstack.resourcedetail.SnapshotPolicyDetailVO;
 import org.apache.cloudstack.resourcedetail.dao.DiskOfferingDetailsDao;
@@ -354,6 +356,8 @@ public class VolumeApiServiceImpl extends ManagerBase 
implements VolumeApiServic
     private BackupDao backupDao;
     @Inject
     HostPodDao podDao;
+    @Inject
+    private ReservationDao reservationDao;
 
 
     protected Gson _gson;
@@ -918,8 +922,12 @@ public class VolumeApiServiceImpl extends ManagerBase 
implements VolumeApiServic
 
         Storage.ProvisioningType provisioningType = 
diskOffering.getProvisioningType();
 
-        // Check that the resource limit for volume & primary storage won't be 
exceeded
-        _resourceLimitMgr.checkVolumeResourceLimit(owner,displayVolume, size, 
diskOffering);
+        List<String> tags = 
_resourceLimitMgr.getResourceLimitStorageTagsForResourceCountOperation(displayVolume,
 diskOffering);
+        if (tags.size() == 1 && tags.get(0) == null) {
+            tags = new ArrayList<>();
+        }
+        try (CheckedReservation volumeReservation = new 
CheckedReservation(owner, ResourceType.volume, null, tags, 1L, reservationDao, 
_resourceLimitMgr);
+             CheckedReservation primaryStorageReservation = new 
CheckedReservation(owner, ResourceType.primary_storage, null, tags, size, 
reservationDao, _resourceLimitMgr)) {
 
         // Verify that zone exists
         DataCenterVO zone = _dcDao.findById(zoneId);
@@ -942,6 +950,10 @@ public class VolumeApiServiceImpl extends ManagerBase 
implements VolumeApiServic
 
         return commitVolume(cmd, caller, owner, displayVolume, zoneId, 
diskOfferingId, provisioningType, size, minIops, maxIops, parentVolume, 
userSpecifiedName,
                 _uuidMgr.generateUuid(Volume.class, cmd.getCustomId()), 
details);
+         } catch (Exception e) {
+            logger.error(e);
+            throw new RuntimeException(e);
+        }
     }
 
     @Override
diff --git 
a/server/src/test/java/com/cloud/vpc/MockResourceLimitManagerImpl.java 
b/server/src/test/java/com/cloud/vpc/MockResourceLimitManagerImpl.java
index 7e8dbbf04c6..045f2178529 100644
--- a/server/src/test/java/com/cloud/vpc/MockResourceLimitManagerImpl.java
+++ b/server/src/test/java/com/cloud/vpc/MockResourceLimitManagerImpl.java
@@ -277,6 +277,11 @@ public class MockResourceLimitManagerImpl extends 
ManagerBase implements Resourc
 
     }
 
+    @Override
+    public List<String> 
getResourceLimitStorageTagsForResourceCountOperation(Boolean display, 
DiskOffering diskOffering) {
+        return null;
+    }
+
     @Override
     public void checkVolumeResourceLimitForDiskOfferingChange(Account owner, 
Boolean display, Long currentSize, Long newSize,
             DiskOffering currentOffering, DiskOffering newOffering) throws 
ResourceAllocationException {

Reply via email to