Skip to content

Commit 556bb56

Browse files
winterhazelDaniel-Pereira-Linux
authored andcommitted
quota: skip usage records registering the period a volume has been attached (#13936)
(cherry picked from commit ba67a62)
1 parent d02adcd commit 556bb56

2 files changed

Lines changed: 68 additions & 0 deletions

File tree

‎framework/quota/src/main/java/org/apache/cloudstack/quota/QuotaManagerImpl.java‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import org.apache.cloudstack.quota.vo.QuotaBalanceVO;
4949
import org.apache.cloudstack.quota.vo.QuotaTariffVO;
5050
import org.apache.cloudstack.quota.vo.QuotaUsageVO;
51+
import org.apache.cloudstack.usage.UsageTypes;
5152
import org.apache.cloudstack.usage.UsageUnitTypes;
5253
import org.apache.cloudstack.utils.bytescale.ByteScaleUtils;
5354
import org.apache.cloudstack.utils.jsinterpreter.JsInterpreter;
@@ -345,6 +346,11 @@ protected boolean shouldCalculateUsageRecord(AccountVO accountVO, UsageVO usageR
345346
usageRecord.toString(usageAggregationTimeZone), accountVO.reflectionToString());
346347
return false;
347348
}
349+
if (usageRecord.getUsageType() == UsageTypes.VOLUME && usageRecord.getVmInstanceId() != null) {
350+
logger.debug("Considering usage record [{}] as calculated and skipping it because it represents the period " +
351+
"a volume has remained attached to an instance, which Quota does not handle.", usageRecord.toString(usageAggregationTimeZone));
352+
return false;
353+
}
348354
return true;
349355
}
350356

‎framework/quota/src/test/java/org/apache/cloudstack/quota/QuotaManagerImplTest.java‎

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,21 +25,27 @@
2525
import java.util.List;
2626
import java.util.Map;
2727

28+
import org.apache.cloudstack.framework.config.ConfigKey;
29+
import org.apache.cloudstack.framework.config.impl.ConfigDepotImpl;
2830
import org.apache.cloudstack.quota.activationrule.presetvariables.Domain;
2931
import org.apache.cloudstack.quota.activationrule.presetvariables.GenericPresetVariable;
3032
import org.apache.cloudstack.quota.activationrule.presetvariables.PresetVariableHelper;
3133
import org.apache.cloudstack.quota.activationrule.presetvariables.PresetVariables;
3234
import org.apache.cloudstack.quota.activationrule.presetvariables.Tariff;
3335
import org.apache.cloudstack.quota.activationrule.presetvariables.Value;
36+
import org.apache.cloudstack.quota.constant.QuotaConfig;
3437
import org.apache.cloudstack.quota.constant.QuotaTypes;
3538
import org.apache.cloudstack.quota.dao.QuotaTariffDao;
3639
import org.apache.cloudstack.quota.dao.QuotaUsageDao;
3740
import org.apache.cloudstack.quota.vo.QuotaTariffVO;
3841
import org.apache.cloudstack.quota.vo.QuotaUsageVO;
42+
import org.apache.cloudstack.usage.UsageTypes;
3943
import org.apache.cloudstack.usage.UsageUnitTypes;
4044
import org.apache.cloudstack.utils.bytescale.ByteScaleUtils;
4145
import org.apache.cloudstack.utils.jsinterpreter.JsInterpreter;
46+
import org.junit.After;
4247
import org.junit.Assert;
48+
import org.junit.Before;
4349
import org.junit.Test;
4450
import org.junit.runner.RunWith;
4551
import org.mockito.InjectMocks;
@@ -89,8 +95,21 @@ public class QuotaManagerImplTest {
8995
@Mock
9096
PresetVariables presetVariablesMock;
9197

98+
@Mock
99+
ConfigDepotImpl configDepotImplMock;
100+
92101
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
93102

103+
@Before
104+
public void setup() {
105+
ConfigKey.init(configDepotImplMock);
106+
}
107+
108+
@After
109+
public void tearDown() {
110+
ConfigKey.init(null);
111+
}
112+
94113
@Test
95114
public void isLockableTestValidateAccountTypes() {
96115
List<Account.Type> lockablesAccountTypes = Arrays.asList(Account.Type.NORMAL, Account.Type.DOMAIN_ADMIN);
@@ -107,6 +126,49 @@ public void isLockableTestValidateAccountTypes() {
107126
});
108127
}
109128

129+
@Test
130+
public void shouldCalculateUsageRecordTestQuotaIsDisabledForAccountReturnFalse() {
131+
Mockito.doReturn(1L).when(accountVoMock).getAccountId();
132+
Mockito.doReturn("false").when(configDepotImplMock).getConfigStringValue(Mockito.eq(QuotaConfig.QuotaAccountEnabled.key()), Mockito.eq(ConfigKey.Scope.Account),
133+
Mockito.eq(1L));
134+
135+
boolean result = quotaManagerImplSpy.shouldCalculateUsageRecord(accountVoMock, usageVoMock);
136+
137+
Assert.assertFalse(result);
138+
}
139+
140+
@Test
141+
public void shouldCalculateUsageRecordTestQuotaIsEnabledForAccountAndUsageRecordIsVolumeWithVmInstanceIdReturnFalse() {
142+
Mockito.doReturn(1L).when(accountVoMock).getAccountId();
143+
Mockito.doReturn(UsageTypes.VOLUME).when(usageVoMock).getUsageType();
144+
Mockito.doReturn(1L).when(usageVoMock).getVmInstanceId();
145+
146+
boolean result = quotaManagerImplSpy.shouldCalculateUsageRecord(accountVoMock, usageVoMock);
147+
148+
Assert.assertFalse(result);
149+
}
150+
151+
@Test
152+
public void shouldCalculateUsageRecordTestQuotaIsEnabledForAccountAndUsageRecordIsVolumeWithoutVmInstanceIdReturnTrue() {
153+
Mockito.doReturn(1L).when(accountVoMock).getAccountId();
154+
Mockito.doReturn(UsageTypes.VOLUME).when(usageVoMock).getUsageType();
155+
Mockito.doReturn(null).when(usageVoMock).getVmInstanceId();
156+
157+
boolean result = quotaManagerImplSpy.shouldCalculateUsageRecord(accountVoMock, usageVoMock);
158+
159+
Assert.assertTrue(result);
160+
}
161+
162+
@Test
163+
public void shouldCalculateUsageRecordTestQuotaIsEnabledForAccountAndUsageRecordIsNotVolumeReturnTrue() {
164+
Mockito.doReturn(1L).when(accountVoMock).getAccountId();
165+
Mockito.doReturn(UsageTypes.RUNNING_VM).when(usageVoMock).getUsageType();
166+
167+
boolean result = quotaManagerImplSpy.shouldCalculateUsageRecord(accountVoMock, usageVoMock);
168+
169+
Assert.assertTrue(result);
170+
}
171+
110172
@Test
111173
public void getPendingUsageRecordsForQuotaAggregationTestNullListReturnNull() {
112174
Mockito.doReturn(pairMock).when(usageDaoMock).listUsageRecordsPendingForQuotaAggregation(Mockito.anyLong(), Mockito.anyLong());

0 commit comments

Comments
 (0)