Skip to content

Commit b025e85

Browse files
DaanHooglandDaan Hoogland
authored andcommitted
Check resource reservation on volume creation
1 parent 7faa1b6 commit b025e85

4 files changed

Lines changed: 22 additions & 4 deletions

File tree

api/src/main/java/com/cloud/user/ResourceLimitService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ public interface ResourceLimitService {
247247
void updateTaggedResourceLimitsAndCountsForAccounts(List<AccountResponse> responses, String tag);
248248
void updateTaggedResourceLimitsAndCountsForDomains(List<DomainResponse> responses, String tag);
249249
void checkVolumeResourceLimit(Account owner, Boolean display, Long size, DiskOffering diskOffering) throws ResourceAllocationException;
250-
250+
List<String> getResourceLimitStorageTagsForResourceCountOperation(Boolean display, DiskOffering diskOffering);
251251
void checkVolumeResourceLimitForDiskOfferingChange(Account owner, Boolean display, Long currentSize, Long newSize,
252252
DiskOffering currentOffering, DiskOffering newOffering) throws ResourceAllocationException;
253253

server/src/main/java/com/cloud/resourcelimit/ResourceLimitManagerImpl.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1647,7 +1647,8 @@ public List<String> getResourceLimitStorageTags(DiskOffering diskOffering) {
16471647
return tags;
16481648
}
16491649

1650-
protected List<String> getResourceLimitStorageTagsForResourceCountOperation(Boolean display, DiskOffering diskOffering) {
1650+
@Override
1651+
public List<String> getResourceLimitStorageTagsForResourceCountOperation(Boolean display, DiskOffering diskOffering) {
16511652
if (Boolean.FALSE.equals(display)) {
16521653
return new ArrayList<>();
16531654
}

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

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535

3636
import javax.inject.Inject;
3737

38+
import com.cloud.resourcelimit.CheckedReservation;
3839
import org.apache.cloudstack.api.ApiConstants;
3940
import org.apache.cloudstack.api.ApiErrorCode;
4041
import org.apache.cloudstack.api.InternalIdentity;
@@ -87,6 +88,7 @@
8788
import org.apache.cloudstack.framework.jobs.impl.OutcomeImpl;
8889
import org.apache.cloudstack.framework.jobs.impl.VmWorkJobVO;
8990
import org.apache.cloudstack.jobs.JobInfo;
91+
import org.apache.cloudstack.reservation.dao.ReservationDao;
9092
import org.apache.cloudstack.resourcedetail.DiskOfferingDetailVO;
9193
import org.apache.cloudstack.resourcedetail.SnapshotPolicyDetailVO;
9294
import org.apache.cloudstack.resourcedetail.dao.DiskOfferingDetailsDao;
@@ -354,6 +356,8 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
354356
private BackupDao backupDao;
355357
@Inject
356358
HostPodDao podDao;
359+
@Inject
360+
private ReservationDao reservationDao;
357361

358362

359363
protected Gson _gson;
@@ -918,8 +922,12 @@ public VolumeVO allocVolume(CreateVolumeCmd cmd) throws ResourceAllocationExcept
918922

919923
Storage.ProvisioningType provisioningType = diskOffering.getProvisioningType();
920924

921-
// Check that the resource limit for volume & primary storage won't be exceeded
922-
_resourceLimitMgr.checkVolumeResourceLimit(owner,displayVolume, size, diskOffering);
925+
List<String> tags = _resourceLimitMgr.getResourceLimitStorageTagsForResourceCountOperation(displayVolume, diskOffering);
926+
if (tags.size() == 1 && tags.get(0) == null) {
927+
tags = new ArrayList<>();
928+
}
929+
try (CheckedReservation volumeReservation = new CheckedReservation(owner, ResourceType.volume, null, tags, 1L, reservationDao, _resourceLimitMgr);
930+
CheckedReservation primaryStorageReservation = new CheckedReservation(owner, ResourceType.primary_storage, null, tags, size, reservationDao, _resourceLimitMgr)) {
923931

924932
// Verify that zone exists
925933
DataCenterVO zone = _dcDao.findById(zoneId);
@@ -942,6 +950,10 @@ public VolumeVO allocVolume(CreateVolumeCmd cmd) throws ResourceAllocationExcept
942950

943951
return commitVolume(cmd, caller, owner, displayVolume, zoneId, diskOfferingId, provisioningType, size, minIops, maxIops, parentVolume, userSpecifiedName,
944952
_uuidMgr.generateUuid(Volume.class, cmd.getCustomId()), details);
953+
} catch (Exception e) {
954+
logger.error(e);
955+
throw new RuntimeException(e);
956+
}
945957
}
946958

947959
@Override

server/src/test/java/com/cloud/vpc/MockResourceLimitManagerImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,11 @@ public void checkVolumeResourceLimit(Account owner, Boolean display, Long size,
277277

278278
}
279279

280+
@Override
281+
public List<String> getResourceLimitStorageTagsForResourceCountOperation(Boolean display, DiskOffering diskOffering) {
282+
return null;
283+
}
284+
280285
@Override
281286
public void checkVolumeResourceLimitForDiskOfferingChange(Account owner, Boolean display, Long currentSize, Long newSize,
282287
DiskOffering currentOffering, DiskOffering newOffering) throws ResourceAllocationException {

0 commit comments

Comments
 (0)