Skip to content

Commit 37d3709

Browse files
committed
<fix>[compute]: add quota check for VM CPU/memory upgrade operations
Resolves: ZSTAC-51417 Change-Id: I0e49827c4c9c07c1be5e7a03b8817a21d424d95d
1 parent 9826a0e commit 37d3709

1 file changed

Lines changed: 65 additions & 0 deletions

File tree

compute/src/main/java/org/zstack/compute/vm/VmQuotaOperator.java

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import org.zstack.header.image.ImageConstant;
1616
import org.zstack.header.message.APIMessage;
1717
import org.zstack.header.message.NeedQuotaCheckMessage;
18+
import org.zstack.header.configuration.InstanceOfferingVO;
1819
import org.zstack.header.vm.*;
1920
import org.zstack.header.volume.*;
2021
import org.zstack.identity.QuotaUtil;
@@ -59,6 +60,10 @@ public void checkQuota(APIMessage msg, Map<String, Quota.QuotaPair> pairs) {
5960
check((APIChangeResourceOwnerMsg) msg, pairs);
6061
} else if (msg instanceof APIRecoverVmInstanceMsg) {
6162
check((APIRecoverVmInstanceMsg) msg, pairs);
63+
} else if (msg instanceof APIChangeInstanceOfferingMsg) {
64+
check((APIChangeInstanceOfferingMsg) msg, pairs);
65+
} else if (msg instanceof APIUpdateVmInstanceMsg) {
66+
check((APIUpdateVmInstanceMsg) msg, pairs);
6267
}
6368
} else {
6469
if (msg instanceof APIChangeResourceOwnerMsg) {
@@ -227,6 +232,66 @@ public void checkVmCupAndMemoryCapacity(String currentAccountUuid, String resour
227232
}
228233
}
229234

235+
@Transactional(readOnly = true)
236+
private void check(APIChangeInstanceOfferingMsg msg, Map<String, Quota.QuotaPair> pairs) {
237+
VmInstanceVO vm = dbf.findByUuid(msg.getVmInstanceUuid(), VmInstanceVO.class);
238+
if (!VmInstanceState.Running.equals(vm.getState())) {
239+
return;
240+
}
241+
InstanceOfferingVO newOffering = dbf.findByUuid(msg.getInstanceOfferingUuid(), InstanceOfferingVO.class);
242+
long cpuDelta = newOffering.getCpuNum() - vm.getCpuNum();
243+
long memoryDelta = newOffering.getMemorySize() - vm.getMemorySize();
244+
String currentAccountUuid = msg.getSession().getAccountUuid();
245+
String resourceOwnerAccountUuid = new QuotaUtil().getResourceOwnerAccountUuid(msg.getVmInstanceUuid());
246+
checkVmCpuAndMemoryDelta(currentAccountUuid, resourceOwnerAccountUuid, cpuDelta, memoryDelta, pairs);
247+
}
248+
249+
@Transactional(readOnly = true)
250+
private void check(APIUpdateVmInstanceMsg msg, Map<String, Quota.QuotaPair> pairs) {
251+
if (msg.getCpuNum() == null && msg.getMemorySize() == null) {
252+
return;
253+
}
254+
VmInstanceVO vm = dbf.findByUuid(msg.getVmInstanceUuid(), VmInstanceVO.class);
255+
if (!VmInstanceState.Running.equals(vm.getState())) {
256+
return;
257+
}
258+
long cpuDelta = msg.getCpuNum() != null ? msg.getCpuNum() - vm.getCpuNum() : 0;
259+
long memoryDelta = msg.getMemorySize() != null ? msg.getMemorySize() - vm.getMemorySize() : 0;
260+
String currentAccountUuid = msg.getSession().getAccountUuid();
261+
String resourceOwnerAccountUuid = new QuotaUtil().getResourceOwnerAccountUuid(msg.getVmInstanceUuid());
262+
checkVmCpuAndMemoryDelta(currentAccountUuid, resourceOwnerAccountUuid, cpuDelta, memoryDelta, pairs);
263+
}
264+
265+
@Transactional(readOnly = true)
266+
private void checkVmCpuAndMemoryDelta(String currentAccountUuid, String resourceOwnerAccountUuid,
267+
long cpuDelta, long memoryDelta,
268+
Map<String, Quota.QuotaPair> pairs) {
269+
if (cpuDelta <= 0 && memoryDelta <= 0) {
270+
return;
271+
}
272+
VmQuotaUtil.VmQuota vmQuotaUsed = new VmQuotaUtil().getUsedVmCpuMemory(resourceOwnerAccountUuid);
273+
if (cpuDelta > 0) {
274+
QuotaUtil.QuotaCompareInfo quotaCompareInfo = new QuotaUtil.QuotaCompareInfo();
275+
quotaCompareInfo.currentAccountUuid = currentAccountUuid;
276+
quotaCompareInfo.resourceTargetOwnerAccountUuid = resourceOwnerAccountUuid;
277+
quotaCompareInfo.quotaName = VmQuotaConstant.VM_RUNNING_CPU_NUM;
278+
quotaCompareInfo.quotaValue = pairs.get(VmQuotaConstant.VM_RUNNING_CPU_NUM).getValue();
279+
quotaCompareInfo.currentUsed = vmQuotaUsed.runningVmCpuNum;
280+
quotaCompareInfo.request = cpuDelta;
281+
new QuotaUtil().CheckQuota(quotaCompareInfo);
282+
}
283+
if (memoryDelta > 0) {
284+
QuotaUtil.QuotaCompareInfo quotaCompareInfo = new QuotaUtil.QuotaCompareInfo();
285+
quotaCompareInfo.currentAccountUuid = currentAccountUuid;
286+
quotaCompareInfo.resourceTargetOwnerAccountUuid = resourceOwnerAccountUuid;
287+
quotaCompareInfo.quotaName = VmQuotaConstant.VM_RUNNING_MEMORY_SIZE;
288+
quotaCompareInfo.quotaValue = pairs.get(VmQuotaConstant.VM_RUNNING_MEMORY_SIZE).getValue();
289+
quotaCompareInfo.currentUsed = vmQuotaUsed.runningVmMemorySize;
290+
quotaCompareInfo.request = memoryDelta;
291+
new QuotaUtil().CheckQuota(quotaCompareInfo);
292+
}
293+
}
294+
230295
private void checkVolumeQuotaForChangeResourceOwner(List<String> dataVolumeUuids,
231296
List<String> rootVolumeUuids,
232297
String resourceTargetOwnerAccountUuid,

0 commit comments

Comments
 (0)