mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
* Fix quota calculation for monthly tariffs * Remove unused parameter
This commit is contained in:
parent
81b49b835a
commit
6c9f0c1f3f
@ -139,16 +139,15 @@ public class QuotaManagerImpl extends ManagerBase implements QuotaManager {
|
|||||||
}
|
}
|
||||||
s_logger.info("Getting pending quota records for account=" + account.getAccountName());
|
s_logger.info("Getting pending quota records for account=" + account.getAccountName());
|
||||||
for (UsageVO usageRecord : usageRecords.first()) {
|
for (UsageVO usageRecord : usageRecords.first()) {
|
||||||
BigDecimal aggregationRatio = new BigDecimal(_aggregationDuration).divide(s_minutesInMonth, 8, RoundingMode.HALF_EVEN);
|
|
||||||
switch (usageRecord.getUsageType()) {
|
switch (usageRecord.getUsageType()) {
|
||||||
case QuotaTypes.RUNNING_VM:
|
case QuotaTypes.RUNNING_VM:
|
||||||
List<QuotaUsageVO> lq = updateQuotaRunningVMUsage(usageRecord, aggregationRatio);
|
List<QuotaUsageVO> lq = updateQuotaRunningVMUsage(usageRecord);
|
||||||
if (!lq.isEmpty()) {
|
if (!lq.isEmpty()) {
|
||||||
quotaListForAccount.addAll(lq);
|
quotaListForAccount.addAll(lq);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case QuotaTypes.ALLOCATED_VM:
|
case QuotaTypes.ALLOCATED_VM:
|
||||||
QuotaUsageVO qu = updateQuotaAllocatedVMUsage(usageRecord, aggregationRatio);
|
QuotaUsageVO qu = updateQuotaAllocatedVMUsage(usageRecord);
|
||||||
if (qu != null) {
|
if (qu != null) {
|
||||||
quotaListForAccount.add(qu);
|
quotaListForAccount.add(qu);
|
||||||
}
|
}
|
||||||
@ -159,7 +158,7 @@ public class QuotaManagerImpl extends ManagerBase implements QuotaManager {
|
|||||||
case QuotaTypes.VOLUME:
|
case QuotaTypes.VOLUME:
|
||||||
case QuotaTypes.VM_SNAPSHOT:
|
case QuotaTypes.VM_SNAPSHOT:
|
||||||
case QuotaTypes.BACKUP:
|
case QuotaTypes.BACKUP:
|
||||||
qu = updateQuotaDiskUsage(usageRecord, aggregationRatio, usageRecord.getUsageType());
|
qu = updateQuotaDiskUsage(usageRecord, usageRecord.getUsageType());
|
||||||
if (qu != null) {
|
if (qu != null) {
|
||||||
quotaListForAccount.add(qu);
|
quotaListForAccount.add(qu);
|
||||||
}
|
}
|
||||||
@ -170,7 +169,7 @@ public class QuotaManagerImpl extends ManagerBase implements QuotaManager {
|
|||||||
case QuotaTypes.NETWORK_OFFERING:
|
case QuotaTypes.NETWORK_OFFERING:
|
||||||
case QuotaTypes.SECURITY_GROUP:
|
case QuotaTypes.SECURITY_GROUP:
|
||||||
case QuotaTypes.VPN_USERS:
|
case QuotaTypes.VPN_USERS:
|
||||||
qu = updateQuotaRaw(usageRecord, aggregationRatio, usageRecord.getUsageType());
|
qu = updateQuotaRaw(usageRecord, usageRecord.getUsageType());
|
||||||
if (qu != null) {
|
if (qu != null) {
|
||||||
quotaListForAccount.add(qu);
|
quotaListForAccount.add(qu);
|
||||||
}
|
}
|
||||||
@ -333,14 +332,14 @@ public class QuotaManagerImpl extends ManagerBase implements QuotaManager {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public QuotaUsageVO updateQuotaDiskUsage(UsageVO usageRecord, final BigDecimal aggregationRatio, final int quotaType) {
|
public QuotaUsageVO updateQuotaDiskUsage(UsageVO usageRecord, final int quotaType) {
|
||||||
QuotaUsageVO quota_usage = null;
|
QuotaUsageVO quota_usage = null;
|
||||||
QuotaTariffVO tariff = _quotaTariffDao.findTariffPlanByUsageType(quotaType, usageRecord.getEndDate());
|
QuotaTariffVO tariff = _quotaTariffDao.findTariffPlanByUsageType(quotaType, usageRecord.getEndDate());
|
||||||
if (tariff != null && tariff.getCurrencyValue().compareTo(BigDecimal.ZERO) != 0) {
|
if (tariff != null && tariff.getCurrencyValue().compareTo(BigDecimal.ZERO) != 0) {
|
||||||
BigDecimal quotaUsgage;
|
BigDecimal quotaUsgage;
|
||||||
BigDecimal onehourcostpergb;
|
BigDecimal onehourcostpergb;
|
||||||
BigDecimal noofgbinuse;
|
BigDecimal noofgbinuse;
|
||||||
onehourcostpergb = tariff.getCurrencyValue().multiply(aggregationRatio);
|
onehourcostpergb = tariff.getCurrencyValue().divide(s_hoursInMonth, 8, RoundingMode.HALF_DOWN);
|
||||||
noofgbinuse = new BigDecimal(usageRecord.getSize()).divide(s_gb, 8, RoundingMode.HALF_EVEN);
|
noofgbinuse = new BigDecimal(usageRecord.getSize()).divide(s_gb, 8, RoundingMode.HALF_EVEN);
|
||||||
quotaUsgage = new BigDecimal(usageRecord.getRawUsage()).multiply(onehourcostpergb).multiply(noofgbinuse);
|
quotaUsgage = new BigDecimal(usageRecord.getRawUsage()).multiply(onehourcostpergb).multiply(noofgbinuse);
|
||||||
quota_usage = new QuotaUsageVO(usageRecord.getId(), usageRecord.getZoneId(), usageRecord.getAccountId(), usageRecord.getDomainId(), usageRecord.getUsageType(),
|
quota_usage = new QuotaUsageVO(usageRecord.getId(), usageRecord.getZoneId(), usageRecord.getAccountId(), usageRecord.getDomainId(), usageRecord.getUsageType(),
|
||||||
@ -352,7 +351,7 @@ public class QuotaManagerImpl extends ManagerBase implements QuotaManager {
|
|||||||
return quota_usage;
|
return quota_usage;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<QuotaUsageVO> updateQuotaRunningVMUsage(UsageVO usageRecord, final BigDecimal aggregationRatio) {
|
public List<QuotaUsageVO> updateQuotaRunningVMUsage(UsageVO usageRecord) {
|
||||||
List<QuotaUsageVO> quotalist = new ArrayList<QuotaUsageVO>();
|
List<QuotaUsageVO> quotalist = new ArrayList<QuotaUsageVO>();
|
||||||
QuotaUsageVO quota_usage;
|
QuotaUsageVO quota_usage;
|
||||||
BigDecimal cpuquotausgage, speedquotausage, memoryquotausage, vmusage;
|
BigDecimal cpuquotausgage, speedquotausage, memoryquotausage, vmusage;
|
||||||
@ -368,7 +367,7 @@ public class QuotaManagerImpl extends ManagerBase implements QuotaManager {
|
|||||||
QuotaTariffVO tariff = _quotaTariffDao.findTariffPlanByUsageType(QuotaTypes.CPU_NUMBER, usageRecord.getEndDate());
|
QuotaTariffVO tariff = _quotaTariffDao.findTariffPlanByUsageType(QuotaTypes.CPU_NUMBER, usageRecord.getEndDate());
|
||||||
if (tariff != null && tariff.getCurrencyValue().compareTo(BigDecimal.ZERO) != 0 && serviceoffering.getCpu() != null) {
|
if (tariff != null && tariff.getCurrencyValue().compareTo(BigDecimal.ZERO) != 0 && serviceoffering.getCpu() != null) {
|
||||||
BigDecimal cpu = new BigDecimal(serviceoffering.getCpu());
|
BigDecimal cpu = new BigDecimal(serviceoffering.getCpu());
|
||||||
onehourcostpercpu = tariff.getCurrencyValue().multiply(aggregationRatio);
|
onehourcostpercpu = tariff.getCurrencyValue().divide(s_hoursInMonth, 8, RoundingMode.HALF_DOWN);
|
||||||
cpuquotausgage = rawusage.multiply(onehourcostpercpu).multiply(cpu);
|
cpuquotausgage = rawusage.multiply(onehourcostpercpu).multiply(cpu);
|
||||||
quota_usage = new QuotaUsageVO(usageRecord.getId(), usageRecord.getZoneId(), usageRecord.getAccountId(), usageRecord.getDomainId(), QuotaTypes.CPU_NUMBER,
|
quota_usage = new QuotaUsageVO(usageRecord.getId(), usageRecord.getZoneId(), usageRecord.getAccountId(), usageRecord.getDomainId(), QuotaTypes.CPU_NUMBER,
|
||||||
cpuquotausgage, usageRecord.getStartDate(), usageRecord.getEndDate());
|
cpuquotausgage, usageRecord.getStartDate(), usageRecord.getEndDate());
|
||||||
@ -377,8 +376,8 @@ public class QuotaManagerImpl extends ManagerBase implements QuotaManager {
|
|||||||
}
|
}
|
||||||
tariff = _quotaTariffDao.findTariffPlanByUsageType(QuotaTypes.CPU_CLOCK_RATE, usageRecord.getEndDate());
|
tariff = _quotaTariffDao.findTariffPlanByUsageType(QuotaTypes.CPU_CLOCK_RATE, usageRecord.getEndDate());
|
||||||
if (tariff != null && tariff.getCurrencyValue().compareTo(BigDecimal.ZERO) != 0 && serviceoffering.getSpeed() != null) {
|
if (tariff != null && tariff.getCurrencyValue().compareTo(BigDecimal.ZERO) != 0 && serviceoffering.getSpeed() != null) {
|
||||||
BigDecimal speed = new BigDecimal(serviceoffering.getSpeed() / 100.00);
|
BigDecimal speed = new BigDecimal(serviceoffering.getSpeed()*serviceoffering.getCpu() / 100.00);
|
||||||
onehourcostper100mhz = tariff.getCurrencyValue().multiply(aggregationRatio);
|
onehourcostper100mhz = tariff.getCurrencyValue().divide(s_hoursInMonth, 8, RoundingMode.HALF_DOWN);
|
||||||
speedquotausage = rawusage.multiply(onehourcostper100mhz).multiply(speed);
|
speedquotausage = rawusage.multiply(onehourcostper100mhz).multiply(speed);
|
||||||
quota_usage = new QuotaUsageVO(usageRecord.getId(), usageRecord.getZoneId(), usageRecord.getAccountId(), usageRecord.getDomainId(), QuotaTypes.CPU_CLOCK_RATE,
|
quota_usage = new QuotaUsageVO(usageRecord.getId(), usageRecord.getZoneId(), usageRecord.getAccountId(), usageRecord.getDomainId(), QuotaTypes.CPU_CLOCK_RATE,
|
||||||
speedquotausage, usageRecord.getStartDate(), usageRecord.getEndDate());
|
speedquotausage, usageRecord.getStartDate(), usageRecord.getEndDate());
|
||||||
@ -388,7 +387,7 @@ public class QuotaManagerImpl extends ManagerBase implements QuotaManager {
|
|||||||
tariff = _quotaTariffDao.findTariffPlanByUsageType(QuotaTypes.MEMORY, usageRecord.getEndDate());
|
tariff = _quotaTariffDao.findTariffPlanByUsageType(QuotaTypes.MEMORY, usageRecord.getEndDate());
|
||||||
if (tariff != null && tariff.getCurrencyValue().compareTo(BigDecimal.ZERO) != 0 && serviceoffering.getRamSize() != null) {
|
if (tariff != null && tariff.getCurrencyValue().compareTo(BigDecimal.ZERO) != 0 && serviceoffering.getRamSize() != null) {
|
||||||
BigDecimal memory = new BigDecimal(serviceoffering.getRamSize());
|
BigDecimal memory = new BigDecimal(serviceoffering.getRamSize());
|
||||||
onehourcostper1mb = tariff.getCurrencyValue().multiply(aggregationRatio);
|
onehourcostper1mb = tariff.getCurrencyValue().divide(s_hoursInMonth, 8, RoundingMode.HALF_DOWN);
|
||||||
memoryquotausage = rawusage.multiply(onehourcostper1mb).multiply(memory);
|
memoryquotausage = rawusage.multiply(onehourcostper1mb).multiply(memory);
|
||||||
quota_usage = new QuotaUsageVO(usageRecord.getId(), usageRecord.getZoneId(), usageRecord.getAccountId(), usageRecord.getDomainId(), QuotaTypes.MEMORY, memoryquotausage,
|
quota_usage = new QuotaUsageVO(usageRecord.getId(), usageRecord.getZoneId(), usageRecord.getAccountId(), usageRecord.getDomainId(), QuotaTypes.MEMORY, memoryquotausage,
|
||||||
usageRecord.getStartDate(), usageRecord.getEndDate());
|
usageRecord.getStartDate(), usageRecord.getEndDate());
|
||||||
@ -397,7 +396,7 @@ public class QuotaManagerImpl extends ManagerBase implements QuotaManager {
|
|||||||
}
|
}
|
||||||
tariff = _quotaTariffDao.findTariffPlanByUsageType(QuotaTypes.RUNNING_VM, usageRecord.getEndDate());
|
tariff = _quotaTariffDao.findTariffPlanByUsageType(QuotaTypes.RUNNING_VM, usageRecord.getEndDate());
|
||||||
if (tariff != null && tariff.getCurrencyValue().compareTo(BigDecimal.ZERO) != 0) {
|
if (tariff != null && tariff.getCurrencyValue().compareTo(BigDecimal.ZERO) != 0) {
|
||||||
onehourcostforvmusage = tariff.getCurrencyValue().multiply(aggregationRatio);
|
onehourcostforvmusage = tariff.getCurrencyValue().divide(s_hoursInMonth, 8, RoundingMode.HALF_DOWN);
|
||||||
vmusage = rawusage.multiply(onehourcostforvmusage);
|
vmusage = rawusage.multiply(onehourcostforvmusage);
|
||||||
quota_usage = new QuotaUsageVO(usageRecord.getId(), usageRecord.getZoneId(), usageRecord.getAccountId(), usageRecord.getDomainId(), QuotaTypes.RUNNING_VM, vmusage,
|
quota_usage = new QuotaUsageVO(usageRecord.getId(), usageRecord.getZoneId(), usageRecord.getAccountId(), usageRecord.getDomainId(), QuotaTypes.RUNNING_VM, vmusage,
|
||||||
usageRecord.getStartDate(), usageRecord.getEndDate());
|
usageRecord.getStartDate(), usageRecord.getEndDate());
|
||||||
@ -410,13 +409,13 @@ public class QuotaManagerImpl extends ManagerBase implements QuotaManager {
|
|||||||
return quotalist;
|
return quotalist;
|
||||||
}
|
}
|
||||||
|
|
||||||
public QuotaUsageVO updateQuotaAllocatedVMUsage(UsageVO usageRecord, final BigDecimal aggregationRatio) {
|
public QuotaUsageVO updateQuotaAllocatedVMUsage(UsageVO usageRecord) {
|
||||||
QuotaUsageVO quota_usage = null;
|
QuotaUsageVO quota_usage = null;
|
||||||
QuotaTariffVO tariff = _quotaTariffDao.findTariffPlanByUsageType(QuotaTypes.ALLOCATED_VM, usageRecord.getEndDate());
|
QuotaTariffVO tariff = _quotaTariffDao.findTariffPlanByUsageType(QuotaTypes.ALLOCATED_VM, usageRecord.getEndDate());
|
||||||
if (tariff != null && tariff.getCurrencyValue().compareTo(BigDecimal.ZERO) != 0) {
|
if (tariff != null && tariff.getCurrencyValue().compareTo(BigDecimal.ZERO) != 0) {
|
||||||
BigDecimal vmusage;
|
BigDecimal vmusage;
|
||||||
BigDecimal onehourcostforvmusage;
|
BigDecimal onehourcostforvmusage;
|
||||||
onehourcostforvmusage = tariff.getCurrencyValue().multiply(aggregationRatio);
|
onehourcostforvmusage = tariff.getCurrencyValue().divide(s_hoursInMonth, 8, RoundingMode.HALF_DOWN);
|
||||||
vmusage = new BigDecimal(usageRecord.getRawUsage()).multiply(onehourcostforvmusage);
|
vmusage = new BigDecimal(usageRecord.getRawUsage()).multiply(onehourcostforvmusage);
|
||||||
quota_usage = new QuotaUsageVO(usageRecord.getId(), usageRecord.getZoneId(), usageRecord.getAccountId(), usageRecord.getDomainId(), QuotaTypes.ALLOCATED_VM, vmusage,
|
quota_usage = new QuotaUsageVO(usageRecord.getId(), usageRecord.getZoneId(), usageRecord.getAccountId(), usageRecord.getDomainId(), QuotaTypes.ALLOCATED_VM, vmusage,
|
||||||
usageRecord.getStartDate(), usageRecord.getEndDate());
|
usageRecord.getStartDate(), usageRecord.getEndDate());
|
||||||
@ -428,13 +427,13 @@ public class QuotaManagerImpl extends ManagerBase implements QuotaManager {
|
|||||||
return quota_usage;
|
return quota_usage;
|
||||||
}
|
}
|
||||||
|
|
||||||
public QuotaUsageVO updateQuotaRaw(UsageVO usageRecord, final BigDecimal aggregationRatio, final int ruleType) {
|
public QuotaUsageVO updateQuotaRaw(UsageVO usageRecord, final int ruleType) {
|
||||||
QuotaUsageVO quota_usage = null;
|
QuotaUsageVO quota_usage = null;
|
||||||
QuotaTariffVO tariff = _quotaTariffDao.findTariffPlanByUsageType(ruleType, usageRecord.getEndDate());
|
QuotaTariffVO tariff = _quotaTariffDao.findTariffPlanByUsageType(ruleType, usageRecord.getEndDate());
|
||||||
if (tariff != null && tariff.getCurrencyValue().compareTo(BigDecimal.ZERO) != 0) {
|
if (tariff != null && tariff.getCurrencyValue().compareTo(BigDecimal.ZERO) != 0) {
|
||||||
BigDecimal ruleusage;
|
BigDecimal ruleusage;
|
||||||
BigDecimal onehourcost;
|
BigDecimal onehourcost;
|
||||||
onehourcost = tariff.getCurrencyValue().multiply(aggregationRatio);
|
onehourcost = tariff.getCurrencyValue().divide(s_hoursInMonth, 8, RoundingMode.HALF_DOWN);
|
||||||
ruleusage = new BigDecimal(usageRecord.getRawUsage()).multiply(onehourcost);
|
ruleusage = new BigDecimal(usageRecord.getRawUsage()).multiply(onehourcost);
|
||||||
quota_usage = new QuotaUsageVO(usageRecord.getId(), usageRecord.getZoneId(), usageRecord.getAccountId(), usageRecord.getDomainId(), ruleType, ruleusage,
|
quota_usage = new QuotaUsageVO(usageRecord.getId(), usageRecord.getZoneId(), usageRecord.getAccountId(), usageRecord.getDomainId(), ruleType, ruleusage,
|
||||||
usageRecord.getStartDate(), usageRecord.getEndDate());
|
usageRecord.getStartDate(), usageRecord.getEndDate());
|
||||||
|
|||||||
@ -151,7 +151,7 @@ public class QuotaManagerImplTest extends TestCase {
|
|||||||
|
|
||||||
QuotaUsageVO quotaUsageVO = new QuotaUsageVO();
|
QuotaUsageVO quotaUsageVO = new QuotaUsageVO();
|
||||||
quotaUsageVO.setAccountId(2L);
|
quotaUsageVO.setAccountId(2L);
|
||||||
Mockito.doReturn(quotaUsageVO).when(quotaManager).updateQuotaAllocatedVMUsage(Mockito.eq(usageVO), Mockito.any(BigDecimal.class));
|
Mockito.doReturn(quotaUsageVO).when(quotaManager).updateQuotaAllocatedVMUsage(Mockito.eq(usageVO));
|
||||||
|
|
||||||
assertTrue(quotaManager.aggregatePendingQuotaRecordsForAccount(accountVO, new Pair<List<? extends UsageVO>, Integer>(null, 0)).size() == 0);
|
assertTrue(quotaManager.aggregatePendingQuotaRecordsForAccount(accountVO, new Pair<List<? extends UsageVO>, Integer>(null, 0)).size() == 0);
|
||||||
assertTrue(quotaManager.aggregatePendingQuotaRecordsForAccount(accountVO, usageRecords).size() == 1);
|
assertTrue(quotaManager.aggregatePendingQuotaRecordsForAccount(accountVO, usageRecords).size() == 1);
|
||||||
@ -172,11 +172,11 @@ public class QuotaManagerImplTest extends TestCase {
|
|||||||
|
|
||||||
QuotaUsageVO qu = quotaManager.updateQuotaNetwork(usageVO, UsageTypes.NETWORK_BYTES_SENT);
|
QuotaUsageVO qu = quotaManager.updateQuotaNetwork(usageVO, UsageTypes.NETWORK_BYTES_SENT);
|
||||||
assertTrue(qu.getQuotaUsed().compareTo(BigDecimal.ZERO) > 0);
|
assertTrue(qu.getQuotaUsed().compareTo(BigDecimal.ZERO) > 0);
|
||||||
qu = quotaManager.updateQuotaAllocatedVMUsage(usageVO, new BigDecimal(0.5));
|
qu = quotaManager.updateQuotaAllocatedVMUsage(usageVO);
|
||||||
assertTrue(qu.getQuotaUsed().compareTo(BigDecimal.ZERO) > 0);
|
assertTrue(qu.getQuotaUsed().compareTo(BigDecimal.ZERO) > 0);
|
||||||
qu = quotaManager.updateQuotaDiskUsage(usageVO, new BigDecimal(0.5), UsageTypes.VOLUME);
|
qu = quotaManager.updateQuotaDiskUsage(usageVO, UsageTypes.VOLUME);
|
||||||
assertTrue(qu.getQuotaUsed().compareTo(BigDecimal.ZERO) > 0);
|
assertTrue(qu.getQuotaUsed().compareTo(BigDecimal.ZERO) > 0);
|
||||||
qu = quotaManager.updateQuotaRaw(usageVO, new BigDecimal(0.5), UsageTypes.VPN_USERS);
|
qu = quotaManager.updateQuotaRaw(usageVO, UsageTypes.VPN_USERS);
|
||||||
assertTrue(qu.getQuotaUsed().compareTo(BigDecimal.ZERO) > 0);
|
assertTrue(qu.getQuotaUsed().compareTo(BigDecimal.ZERO) > 0);
|
||||||
|
|
||||||
Mockito.verify(quotaUsageDao, Mockito.times(4)).persistQuotaUsage(Mockito.any(QuotaUsageVO.class));
|
Mockito.verify(quotaUsageDao, Mockito.times(4)).persistQuotaUsage(Mockito.any(QuotaUsageVO.class));
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user