Skip to content

Commit 1f849ca

Browse files
GutoVeroneziDaan Hoogland
authored andcommitted
[22.0] resource reservation on volume creation
1 parent 831ef82 commit 1f849ca

4 files changed

Lines changed: 33 additions & 14 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
@@ -253,7 +253,7 @@ public interface ResourceLimitService {
253253
void updateTaggedResourceLimitsAndCountsForAccounts(List<AccountResponse> responses, String tag);
254254
void updateTaggedResourceLimitsAndCountsForDomains(List<DomainResponse> responses, String tag);
255255
void checkVolumeResourceLimit(Account owner, Boolean display, Long size, DiskOffering diskOffering) throws ResourceAllocationException;
256-
256+
List<String> getResourceLimitStorageTagsForResourceCountOperation(Boolean display, DiskOffering diskOffering);
257257
void checkVolumeResourceLimitForDiskOfferingChange(Account owner, Boolean display, Long currentSize, Long newSize,
258258
DiskOffering currentOffering, DiskOffering newOffering) throws ResourceAllocationException;
259259

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

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

1732-
protected List<String> getResourceLimitStorageTagsForResourceCountOperation(Boolean display, DiskOffering diskOffering) {
1732+
@Override
1733+
public List<String> getResourceLimitStorageTagsForResourceCountOperation(Boolean display, DiskOffering diskOffering) {
17331734
if (Boolean.FALSE.equals(display)) {
17341735
return new ArrayList<>();
17351736
}

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

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -35,16 +35,11 @@
3535

3636
import javax.inject.Inject;
3737

38-
import com.cloud.projects.Project;
39-
import com.cloud.projects.ProjectManager;
40-
import com.cloud.vm.snapshot.VMSnapshot;
41-
import com.cloud.vm.snapshot.VMSnapshotDetailsVO;
42-
import com.cloud.vm.snapshot.dao.VMSnapshotDetailsDao;
43-
import org.apache.cloudstack.api.command.user.volume.AssignVolumeCmd;
4438
import org.apache.cloudstack.api.ApiConstants;
4539
import org.apache.cloudstack.api.ApiErrorCode;
4640
import org.apache.cloudstack.api.InternalIdentity;
4741
import org.apache.cloudstack.api.ServerApiException;
42+
import org.apache.cloudstack.api.command.user.volume.AssignVolumeCmd;
4843
import org.apache.cloudstack.api.command.user.volume.AttachVolumeCmd;
4944
import org.apache.cloudstack.api.command.user.volume.ChangeOfferingForVolumeCmd;
5045
import org.apache.cloudstack.api.command.user.volume.CheckAndRepairVolumeCmd;
@@ -94,6 +89,7 @@
9489
import org.apache.cloudstack.framework.jobs.impl.OutcomeImpl;
9590
import org.apache.cloudstack.framework.jobs.impl.VmWorkJobVO;
9691
import org.apache.cloudstack.jobs.JobInfo;
92+
import org.apache.cloudstack.reservation.dao.ReservationDao;
9793
import org.apache.cloudstack.resourcedetail.DiskOfferingDetailVO;
9894
import org.apache.cloudstack.resourcedetail.SnapshotPolicyDetailVO;
9995
import org.apache.cloudstack.resourcedetail.dao.DiskOfferingDetailsDao;
@@ -166,8 +162,11 @@
166162
import com.cloud.offering.DiskOffering;
167163
import com.cloud.org.Cluster;
168164
import com.cloud.org.Grouping;
165+
import com.cloud.projects.Project;
166+
import com.cloud.projects.ProjectManager;
169167
import com.cloud.resource.ResourceManager;
170168
import com.cloud.resource.ResourceState;
169+
import com.cloud.resourcelimit.CheckedReservation;
171170
import com.cloud.serializer.GsonHelper;
172171
import com.cloud.server.ManagementService;
173172
import com.cloud.server.ResourceTag;
@@ -242,8 +241,12 @@
242241
import com.cloud.vm.dao.UserVmDao;
243242
import com.cloud.vm.dao.VMInstanceDetailsDao;
244243
import com.cloud.vm.dao.VMInstanceDao;
244+
import com.cloud.vm.snapshot.VMSnapshot;
245+
import com.cloud.vm.snapshot.VMSnapshotDetailsVO;
245246
import com.cloud.vm.snapshot.VMSnapshotVO;
246247
import com.cloud.vm.snapshot.dao.VMSnapshotDao;
248+
import com.cloud.vm.snapshot.dao.VMSnapshotDetailsDao;
249+
247250
import com.google.gson.Gson;
248251
import com.google.gson.GsonBuilder;
249252
import com.google.gson.JsonParseException;
@@ -367,6 +370,8 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
367370
HostPodDao podDao;
368371
@Inject
369372
EndPointSelector _epSelector;
373+
@Inject
374+
private ReservationDao reservationDao;
370375

371376
@Inject
372377
private VMSnapshotDetailsDao vmSnapshotDetailsDao;
@@ -937,8 +942,12 @@ public VolumeVO allocVolume(CreateVolumeCmd cmd) throws ResourceAllocationExcept
937942

938943
Storage.ProvisioningType provisioningType = diskOffering.getProvisioningType();
939944

940-
// Check that the resource limit for volume & primary storage won't be exceeded
941-
_resourceLimitMgr.checkVolumeResourceLimit(owner,displayVolume, size, diskOffering);
945+
List<String> tags = _resourceLimitMgr.getResourceLimitStorageTagsForResourceCountOperation(displayVolume, diskOffering);
946+
if (tags.size() == 1 && tags.get(0) == null) {
947+
tags = new ArrayList<>();
948+
}
949+
try (CheckedReservation volumeReservation = new CheckedReservation(owner, ResourceType.volume, null, tags, 1L, reservationDao, _resourceLimitMgr);
950+
CheckedReservation primaryStorageReservation = new CheckedReservation(owner, ResourceType.primary_storage, null, tags, size, reservationDao, _resourceLimitMgr)) {
942951

943952
// Verify that zone exists
944953
DataCenterVO zone = _dcDao.findById(zoneId);
@@ -961,6 +970,10 @@ public VolumeVO allocVolume(CreateVolumeCmd cmd) throws ResourceAllocationExcept
961970

962971
return commitVolume(cmd.getSnapshotId(), caller, owner, displayVolume, zoneId, diskOfferingId, provisioningType, size, minIops, maxIops, parentVolume, userSpecifiedName,
963972
_uuidMgr.generateUuid(Volume.class, cmd.getCustomId()), details);
973+
} catch (Exception e) {
974+
logger.error(e);
975+
throw new RuntimeException(e);
976+
}
964977
}
965978

966979
@Override
@@ -978,7 +991,7 @@ private VolumeVO commitVolume(final Long snapshotId, final Account caller, final
978991
return Transaction.execute(new TransactionCallback<VolumeVO>() {
979992
@Override
980993
public VolumeVO doInTransaction(TransactionStatus status) {
981-
VolumeVO volume = new VolumeVO(userSpecifiedName, -1, -1, -1, -1, new Long(-1), null, null, provisioningType, 0, Volume.Type.DATADISK);
994+
VolumeVO volume = new VolumeVO(userSpecifiedName, -1, -1, -1, -1, -1L, null, null, provisioningType, 0, Volume.Type.DATADISK);
982995
volume.setPoolId(null);
983996
volume.setUuid(uuid);
984997
volume.setDataCenterId(zoneId);
@@ -5276,20 +5289,20 @@ private Pair<JobInfo.Status, String> orchestrateExtractVolume(VmWorkExtractVolum
52765289
private Pair<JobInfo.Status, String> orchestrateAttachVolumeToVM(VmWorkAttachVolume work) throws Exception {
52775290
Volume vol = orchestrateAttachVolumeToVM(work.getVmId(), work.getVolumeId(), work.getDeviceId());
52785291

5279-
return new Pair<JobInfo.Status, String>(JobInfo.Status.SUCCEEDED, _jobMgr.marshallResultObject(new Long(vol.getId())));
5292+
return new Pair<JobInfo.Status, String>(JobInfo.Status.SUCCEEDED, _jobMgr.marshallResultObject(vol.getId()));
52805293
}
52815294

52825295
@ReflectionUse
52835296
private Pair<JobInfo.Status, String> orchestrateDetachVolumeFromVM(VmWorkDetachVolume work) throws Exception {
52845297
Volume vol = orchestrateDetachVolumeFromVM(work.getVmId(), work.getVolumeId());
5285-
return new Pair<JobInfo.Status, String>(JobInfo.Status.SUCCEEDED, _jobMgr.marshallResultObject(new Long(vol.getId())));
5298+
return new Pair<JobInfo.Status, String>(JobInfo.Status.SUCCEEDED, _jobMgr.marshallResultObject(vol.getId()));
52865299
}
52875300

52885301
@ReflectionUse
52895302
private Pair<JobInfo.Status, String> orchestrateResizeVolume(VmWorkResizeVolume work) throws Exception {
52905303
Volume vol = orchestrateResizeVolume(work.getVolumeId(), work.getCurrentSize(), work.getNewSize(), work.getNewMinIops(), work.getNewMaxIops(), work.getNewHypervisorSnapshotReserve(),
52915304
work.getNewServiceOfferingId(), work.isShrinkOk());
5292-
return new Pair<JobInfo.Status, String>(JobInfo.Status.SUCCEEDED, _jobMgr.marshallResultObject(new Long(vol.getId())));
5305+
return new Pair<JobInfo.Status, String>(JobInfo.Status.SUCCEEDED, _jobMgr.marshallResultObject(vol.getId()));
52935306
}
52945307

52955308
@ReflectionUse

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)