diff --git a/server/src/com/cloud/resourcelimit/ResourceLimitManagerImpl.java b/server/src/com/cloud/resourcelimit/ResourceLimitManagerImpl.java index 25afd0115eaa..43d44a2ef7a0 100644 --- a/server/src/com/cloud/resourcelimit/ResourceLimitManagerImpl.java +++ b/server/src/com/cloud/resourcelimit/ResourceLimitManagerImpl.java @@ -29,6 +29,8 @@ import javax.inject.Inject; import javax.naming.ConfigurationException; +import com.cloud.vm.UserVmDetailVO; +import com.cloud.vm.dao.UserVmDetailsDao; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; @@ -123,6 +125,8 @@ public class ResourceLimitManagerImpl extends ManagerBase implements ResourceLim @Inject private UserVmDao _userVmDao; @Inject + private UserVmDetailsDao _userVmDetailsDao; + @Inject private AccountDao _accountDao; @Inject protected SnapshotDao _snapshotDao; @@ -938,11 +942,28 @@ public long countCpusForAccount(long accountId) { sc.setJoinParameters("offerings", "state", new Object[] {State.Destroyed, State.Error, State.Expunging}); sc.setJoinParameters("offerings", "displayVm", 1); List cpus = _serviceOfferingDao.customSearch(sc, null); + long total = 0; if (cpus != null) { - return cpus.get(0).sum; - } else { - return 0; + total = cpus.get(0).sum; } + + GenericSearchBuilder detailCpuSearch = _userVmDetailsDao.createSearchBuilder(SumCount.class); + detailCpuSearch.select("sum", Func.SUM, detailCpuSearch.entity().getValue()); + detailCpuSearch.and("name", detailCpuSearch.entity().getName(), Op.EQ); + detailCpuSearch.join("vms", join1, detailCpuSearch.entity().getResourceId(), join1.entity().getId(), JoinBuilder.JoinType.INNER); + + sc = detailCpuSearch.create(); + sc.setParameters("name", "cpu"); + sc.setJoinParameters("vms", "accountId", accountId); + sc.setJoinParameters("vms", "type", VirtualMachine.Type.User); + sc.setJoinParameters("vms", "state", new Object[] {State.Destroyed, State.Error, State.Expunging}); + sc.setJoinParameters("vms", "displayVm", 1); + + cpus = _userVmDetailsDao.customSearch(sc, null); + if (cpus != null) { + total += cpus.get(0).sum; + } + return total; } public long calculateMemoryForAccount(long accountId) { @@ -962,11 +983,27 @@ public long calculateMemoryForAccount(long accountId) { sc.setJoinParameters("offerings", "state", new Object[] {State.Destroyed, State.Error, State.Expunging}); sc.setJoinParameters("offerings", "displayVm", 1); List memory = _serviceOfferingDao.customSearch(sc, null); + long total = 0; if (memory != null) { - return memory.get(0).sum; - } else { - return 0; + total = memory.get(0).sum; + } + + GenericSearchBuilder detailMemorySearch = _userVmDetailsDao.createSearchBuilder(SumCount.class); + detailMemorySearch.select("sum", Func.SUM, detailMemorySearch.entity().getValue()); + detailMemorySearch.and("name", detailMemorySearch.entity().getName(), Op.EQ); + detailMemorySearch.join("vms", join1, detailMemorySearch.entity().getResourceId(), join1.entity().getId(), JoinBuilder.JoinType.INNER); + sc = detailMemorySearch.create(); + sc.setParameters("name", "memory"); + sc.setJoinParameters("vms", "accountId", accountId); + sc.setJoinParameters("vms", "type", VirtualMachine.Type.User); + sc.setJoinParameters("vms", "state", new Object[] {State.Destroyed, State.Error, State.Expunging}); + sc.setJoinParameters("vms", "displayVm", 1); + + memory = _userVmDetailsDao.customSearch(sc, null); + if (memory != null) { + total += memory.get(0).sum; } + return total; } public long calculateSecondaryStorageForAccount(long accountId) {