3535
3636import 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 ;
4438import org .apache .cloudstack .api .ApiConstants ;
4539import org .apache .cloudstack .api .ApiErrorCode ;
4640import org .apache .cloudstack .api .InternalIdentity ;
4741import org .apache .cloudstack .api .ServerApiException ;
42+ import org .apache .cloudstack .api .command .user .volume .AssignVolumeCmd ;
4843import org .apache .cloudstack .api .command .user .volume .AttachVolumeCmd ;
4944import org .apache .cloudstack .api .command .user .volume .ChangeOfferingForVolumeCmd ;
5045import org .apache .cloudstack .api .command .user .volume .CheckAndRepairVolumeCmd ;
9489import org .apache .cloudstack .framework .jobs .impl .OutcomeImpl ;
9590import org .apache .cloudstack .framework .jobs .impl .VmWorkJobVO ;
9691import org .apache .cloudstack .jobs .JobInfo ;
92+ import org .apache .cloudstack .reservation .dao .ReservationDao ;
9793import org .apache .cloudstack .resourcedetail .DiskOfferingDetailVO ;
9894import org .apache .cloudstack .resourcedetail .SnapshotPolicyDetailVO ;
9995import org .apache .cloudstack .resourcedetail .dao .DiskOfferingDetailsDao ;
166162import com .cloud .offering .DiskOffering ;
167163import com .cloud .org .Cluster ;
168164import com .cloud .org .Grouping ;
165+ import com .cloud .projects .Project ;
166+ import com .cloud .projects .ProjectManager ;
169167import com .cloud .resource .ResourceManager ;
170168import com .cloud .resource .ResourceState ;
169+ import com .cloud .resourcelimit .CheckedReservation ;
171170import com .cloud .serializer .GsonHelper ;
172171import com .cloud .server .ManagementService ;
173172import com .cloud .server .ResourceTag ;
242241import com .cloud .vm .dao .UserVmDao ;
243242import com .cloud .vm .dao .VMInstanceDetailsDao ;
244243import com .cloud .vm .dao .VMInstanceDao ;
244+ import com .cloud .vm .snapshot .VMSnapshot ;
245+ import com .cloud .vm .snapshot .VMSnapshotDetailsVO ;
245246import com .cloud .vm .snapshot .VMSnapshotVO ;
246247import com .cloud .vm .snapshot .dao .VMSnapshotDao ;
248+ import com .cloud .vm .snapshot .dao .VMSnapshotDetailsDao ;
249+
247250import com .google .gson .Gson ;
248251import com .google .gson .GsonBuilder ;
249252import 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
0 commit comments