This is an automated email from the ASF dual-hosted git repository.

dahn pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/main by this push:
     new 5c20e7844c Quota VM_DISK tariff calculation (#7152)
5c20e7844c is described below

commit 5c20e7844c17b633aa3adac7f96fa0af34d62c7f
Author: Bryan Lima <[email protected]>
AuthorDate: Fri Feb 3 04:43:05 2023 -0300

    Quota VM_DISK tariff calculation (#7152)
    
    Co-authored-by: Daniel Augusto Veronezi Salvador 
<[email protected]>
---
 .../java/org/apache/cloudstack/usage/UsageUnitTypes.java   |  4 +++-
 .../src/main/resources/META-INF/db/schema-41720to41800.sql |  4 ++++
 .../java/org/apache/cloudstack/quota/QuotaManagerImpl.java | 14 ++++----------
 .../org/apache/cloudstack/quota/constant/QuotaTypes.java   |  8 ++++----
 .../org/apache/cloudstack/quota/QuotaManagerImplTest.java  |  6 ++++++
 5 files changed, 21 insertions(+), 15 deletions(-)

diff --git a/api/src/main/java/org/apache/cloudstack/usage/UsageUnitTypes.java 
b/api/src/main/java/org/apache/cloudstack/usage/UsageUnitTypes.java
index 7ae22799f1..ffaaf0cb84 100644
--- a/api/src/main/java/org/apache/cloudstack/usage/UsageUnitTypes.java
+++ b/api/src/main/java/org/apache/cloudstack/usage/UsageUnitTypes.java
@@ -22,7 +22,9 @@ public enum UsageUnitTypes {
     IP_MONTH ("IP*Month"),
     GB ("GB"),
     GB_MONTH ("GB*Month"),
-    POLICY_MONTH ("Policy*Month");
+    POLICY_MONTH ("Policy*Month"),
+    IOPS ("IOPS"),
+    BYTES ("Bytes");
 
     private final String description;
 
diff --git 
a/engine/schema/src/main/resources/META-INF/db/schema-41720to41800.sql 
b/engine/schema/src/main/resources/META-INF/db/schema-41720to41800.sql
index fe0c2f8c61..b38e2584ac 100644
--- a/engine/schema/src/main/resources/META-INF/db/schema-41720to41800.sql
+++ b/engine/schema/src/main/resources/META-INF/db/schema-41720to41800.sql
@@ -1493,3 +1493,7 @@ CREATE TABLE IF NOT EXISTS `cloud`.`console_session` (
 INSERT INTO `cloud`.`role_permissions` (`uuid`, `role_id`, `rule`, 
`permission`) VALUES (UUID(), 2, 'assignVolume', 'ALLOW');
 INSERT INTO `cloud`.`role_permissions` (`uuid`, `role_id`, `rule`, 
`permission`) VALUES (UUID(), 3, 'assignVolume', 'ALLOW');
 
+
+-- Increases the precision of the column `quota_used` from 15 to 20, keeping 
the scale of 8.
+
+ALTER TABLE `cloud_usage`.`quota_usage` MODIFY COLUMN quota_used decimal(20,8) 
unsigned NOT NULL;
diff --git 
a/framework/quota/src/main/java/org/apache/cloudstack/quota/QuotaManagerImpl.java
 
b/framework/quota/src/main/java/org/apache/cloudstack/quota/QuotaManagerImpl.java
index e9c9380778..b17d27b0ad 100644
--- 
a/framework/quota/src/main/java/org/apache/cloudstack/quota/QuotaManagerImpl.java
+++ 
b/framework/quota/src/main/java/org/apache/cloudstack/quota/QuotaManagerImpl.java
@@ -45,7 +45,6 @@ import org.apache.cloudstack.quota.vo.QuotaAccountVO;
 import org.apache.cloudstack.quota.vo.QuotaBalanceVO;
 import org.apache.cloudstack.quota.vo.QuotaTariffVO;
 import org.apache.cloudstack.quota.vo.QuotaUsageVO;
-import org.apache.cloudstack.usage.UsageTypes;
 import org.apache.cloudstack.usage.UsageUnitTypes;
 import org.apache.cloudstack.utils.bytescale.ByteScaleUtils;
 import org.apache.cloudstack.utils.jsinterpreter.JsInterpreter;
@@ -95,9 +94,6 @@ public class QuotaManagerImpl extends ManagerBase implements 
QuotaManager {
     static final BigDecimal GiB_DECIMAL = 
BigDecimal.valueOf(ByteScaleUtils.GiB);
     List<Account.Type> lockablesAccountTypes = 
Arrays.asList(Account.Type.NORMAL, Account.Type.DOMAIN_ADMIN);
 
-    List<Integer> usageTypesToAvoidCalculation = 
Arrays.asList(UsageTypes.VM_DISK_IO_READ, UsageTypes.VM_DISK_IO_WRITE, 
UsageTypes.VM_DISK_BYTES_READ,
-            UsageTypes.VM_DISK_BYTES_WRITE);
-
     public QuotaManagerImpl() {
         super();
     }
@@ -344,12 +340,6 @@ public class QuotaManagerImpl extends ManagerBase 
implements QuotaManager {
     }
 
     protected boolean shouldCalculateUsageRecord(AccountVO accountVO, UsageVO 
usageRecord) {
-        if (usageTypesToAvoidCalculation.contains(usageRecord.getUsageType())) 
{
-            s_logger.debug(String.format("Considering usage record [%s] as 
calculated and skipping it because the calculation of the types [%s] has not 
been implemented yet.",
-                    usageRecord, usageTypesToAvoidCalculation));
-            return false;
-        }
-
         if 
(Boolean.FALSE.equals(QuotaConfig.QuotaAccountEnabled.valueIn(accountVO.getAccountId())))
 {
             s_logger.debug(String.format("Considering usage record [%s] as 
calculated and skipping it because account [%s] has the quota plugin disabled.",
                     usageRecord, accountVO.reflectionToString()));
@@ -559,6 +549,10 @@ public class QuotaManagerImpl extends ManagerBase 
implements QuotaManager {
                 BigDecimal gbInUse = 
BigDecimal.valueOf(usageRecord.getSize()).divide(GiB_DECIMAL, 8, 
RoundingMode.HALF_EVEN);
                 return rawUsage.multiply(costPerHour).multiply(gbInUse);
 
+            case BYTES:
+            case IOPS:
+                return rawUsage.multiply(aggregatedQuotaTariffsValue);
+
             default:
                 return BigDecimal.ZERO;
         }
diff --git 
a/framework/quota/src/main/java/org/apache/cloudstack/quota/constant/QuotaTypes.java
 
b/framework/quota/src/main/java/org/apache/cloudstack/quota/constant/QuotaTypes.java
index 653ad2a94b..553dc840c0 100644
--- 
a/framework/quota/src/main/java/org/apache/cloudstack/quota/constant/QuotaTypes.java
+++ 
b/framework/quota/src/main/java/org/apache/cloudstack/quota/constant/QuotaTypes.java
@@ -47,10 +47,10 @@ public class QuotaTypes extends UsageTypes {
         quotaTypeList.put(PORT_FORWARDING_RULE, new 
QuotaTypes(PORT_FORWARDING_RULE, "PORT_FORWARDING_RULE", 
UsageUnitTypes.POLICY_MONTH.toString(), "Port Forwarding Usage"));
         quotaTypeList.put(NETWORK_OFFERING, new QuotaTypes(NETWORK_OFFERING, 
"NETWORK_OFFERING", UsageUnitTypes.POLICY_MONTH.toString(), "Network Offering 
Usage"));
         quotaTypeList.put(VPN_USERS, new QuotaTypes(VPN_USERS, "VPN_USERS", 
UsageUnitTypes.POLICY_MONTH.toString(), "VPN users usage"));
-        quotaTypeList.put(VM_DISK_IO_READ, new QuotaTypes(VM_DISK_IO_READ, 
"VM_DISK_IO_READ", UsageUnitTypes.GB.toString(), "VM Disk usage(I/O Read)"));
-        quotaTypeList.put(VM_DISK_IO_WRITE, new QuotaTypes(VM_DISK_IO_WRITE, 
"VM_DISK_IO_WRITE", UsageUnitTypes.GB.toString(), "VM Disk usage(I/O Write)"));
-        quotaTypeList.put(VM_DISK_BYTES_READ, new 
QuotaTypes(VM_DISK_BYTES_READ, "VM_DISK_BYTES_READ", 
UsageUnitTypes.GB.toString(), "VM Disk usage(Bytes Read)"));
-        quotaTypeList.put(VM_DISK_BYTES_WRITE, new 
QuotaTypes(VM_DISK_BYTES_WRITE, "VM_DISK_BYTES_WRITE", 
UsageUnitTypes.GB.toString(), "VM Disk usage(Bytes Write)"));
+        quotaTypeList.put(VM_DISK_IO_READ, new QuotaTypes(VM_DISK_IO_READ, 
"VM_DISK_IO_READ", UsageUnitTypes.IOPS.toString(), "VM Disk usage(I/O Read)"));
+        quotaTypeList.put(VM_DISK_IO_WRITE, new QuotaTypes(VM_DISK_IO_WRITE, 
"VM_DISK_IO_WRITE", UsageUnitTypes.IOPS.toString(), "VM Disk usage(I/O 
Write)"));
+        quotaTypeList.put(VM_DISK_BYTES_READ, new 
QuotaTypes(VM_DISK_BYTES_READ, "VM_DISK_BYTES_READ", 
UsageUnitTypes.BYTES.toString(), "VM Disk usage(Bytes Read)"));
+        quotaTypeList.put(VM_DISK_BYTES_WRITE, new 
QuotaTypes(VM_DISK_BYTES_WRITE, "VM_DISK_BYTES_WRITE", 
UsageUnitTypes.BYTES.toString(), "VM Disk usage(Bytes Write)"));
         quotaTypeList.put(VM_SNAPSHOT, new QuotaTypes(VM_SNAPSHOT, 
"VM_SNAPSHOT", UsageUnitTypes.GB_MONTH.toString(), "VM Snapshot storage 
usage"));
         quotaTypeList.put(VOLUME_SECONDARY, new QuotaTypes(VOLUME_SECONDARY, 
"VOLUME_SECONDARY", UsageUnitTypes.GB_MONTH.toString(), "Volume secondary 
storage usage"));
         quotaTypeList.put(VM_SNAPSHOT_ON_PRIMARY, new 
QuotaTypes(VM_SNAPSHOT_ON_PRIMARY, "VM_SNAPSHOT_ON_PRIMARY", 
UsageUnitTypes.GB_MONTH.toString(), "VM Snapshot primary storage usage"));
diff --git 
a/framework/quota/src/test/java/org/apache/cloudstack/quota/QuotaManagerImplTest.java
 
b/framework/quota/src/test/java/org/apache/cloudstack/quota/QuotaManagerImplTest.java
index 9ce20c11ba..5978dcf5fc 100644
--- 
a/framework/quota/src/test/java/org/apache/cloudstack/quota/QuotaManagerImplTest.java
+++ 
b/framework/quota/src/test/java/org/apache/cloudstack/quota/QuotaManagerImplTest.java
@@ -166,6 +166,12 @@ public class QuotaManagerImplTest {
                    expected = 5.5555556;
                    break;
 
+               case BYTES:
+               case IOPS:
+                   //The value 4000.0 is referent to the calculation ( raw 
usage * tariffs values ).
+                   expected = 4000.0;
+                   break;
+
                default:
                    break;
            }

Reply via email to