diff --git a/engine/schema/src/main/resources/META-INF/cloudstack/core/spring-engine-schema-core-common-daos-between-management-and-usage-context.xml b/engine/schema/src/main/resources/META-INF/cloudstack/core/spring-engine-schema-core-common-daos-between-management-and-usage-context.xml
index d6d72f9228e1..edb4b8dcecc7 100644
--- a/engine/schema/src/main/resources/META-INF/cloudstack/core/spring-engine-schema-core-common-daos-between-management-and-usage-context.xml
+++ b/engine/schema/src/main/resources/META-INF/cloudstack/core/spring-engine-schema-core-common-daos-between-management-and-usage-context.xml
@@ -28,6 +28,9 @@
>
+
+
+
diff --git a/framework/quota/src/main/java/org/apache/cloudstack/quota/QuotaAlertManagerImpl.java b/framework/quota/src/main/java/org/apache/cloudstack/quota/QuotaAlertManagerImpl.java
index b26b3171f5b5..843febb032c5 100644
--- a/framework/quota/src/main/java/org/apache/cloudstack/quota/QuotaAlertManagerImpl.java
+++ b/framework/quota/src/main/java/org/apache/cloudstack/quota/QuotaAlertManagerImpl.java
@@ -149,7 +149,7 @@ public boolean stop() {
*/
@Override
public boolean isQuotaEmailTypeEnabledForAccount(AccountVO account, QuotaEmailTemplateTypes quotaEmailTemplateType) {
- boolean quotaEmailsEnabled = QuotaConfig.QuotaEnableEmails.valueIn(account.getAccountId());
+ boolean quotaEmailsEnabled = _quotaManager.findConfigurationValue(account, QuotaConfig.QuotaEnableEmails);
if (!quotaEmailsEnabled) {
logger.debug("Configuration [{}] is disabled for account [{}]. Therefore, the account will not receive Quota email of type [{}].", QuotaConfig.QuotaEnableEmails.key(), account, quotaEmailTemplateType);
return false;
diff --git a/framework/quota/src/main/java/org/apache/cloudstack/quota/QuotaManager.java b/framework/quota/src/main/java/org/apache/cloudstack/quota/QuotaManager.java
index 7811bcbccad7..94a5de8a54ff 100644
--- a/framework/quota/src/main/java/org/apache/cloudstack/quota/QuotaManager.java
+++ b/framework/quota/src/main/java/org/apache/cloudstack/quota/QuotaManager.java
@@ -18,6 +18,7 @@
import com.cloud.user.AccountVO;
import com.cloud.utils.component.Manager;
+import org.apache.cloudstack.framework.config.ConfigKey;
public interface QuotaManager extends Manager {
@@ -25,4 +26,6 @@ public interface QuotaManager extends Manager {
boolean isLockable(AccountVO account);
+ boolean findConfigurationValue(AccountVO accountVO, ConfigKey key);
+
}
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 a03f82a43586..be892785a5c2 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
@@ -32,7 +32,12 @@
import javax.inject.Inject;
import javax.naming.ConfigurationException;
+import com.cloud.domain.DomainDetailVO;
+import com.cloud.domain.dao.DomainDetailsDao;
import com.cloud.user.Account;
+import com.cloud.user.AccountDetailVO;
+import com.cloud.user.AccountDetailsDao;
+import org.apache.cloudstack.framework.config.ConfigKey;
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
import org.apache.cloudstack.quota.activationrule.presetvariables.Configuration;
import org.apache.cloudstack.quota.activationrule.presetvariables.GenericPresetVariable;
@@ -89,6 +94,10 @@ public class QuotaManagerImpl extends ManagerBase implements QuotaManager {
@Inject
protected PresetVariableHelper presetVariableHelper;
+ @Inject
+ protected AccountDetailsDao accountDetailsDao;
+ @Inject
+ protected DomainDetailsDao domainDetailsDao;
private static TimeZone usageAggregationTimeZone = TimeZone.getTimeZone("GMT");
static final BigDecimal GiB_DECIMAL = BigDecimal.valueOf(ByteScaleUtils.GiB);
@@ -340,12 +349,41 @@ protected List createQuotaUsagesAccordingToQuotaTariffs(AccountVO
}
protected boolean shouldCalculateUsageRecord(AccountVO accountVO, UsageVO usageRecord) {
- if (Boolean.FALSE.equals(QuotaConfig.QuotaAccountEnabled.valueIn(accountVO.getAccountId()))) {
+ boolean calculateUsageRecord = findConfigurationValue(accountVO, QuotaConfig.QuotaAccountEnabled);
+ if (!calculateUsageRecord && usageRecord != null) {
logger.debug("Considering usage record [{}] as calculated and skipping it because account [{}] has the quota plugin disabled.",
usageRecord.toString(usageAggregationTimeZone), accountVO.reflectionToString());
return false;
}
- return true;
+ return calculateUsageRecord;
+ }
+
+ @Override
+ public boolean findConfigurationValue(AccountVO accountVO, ConfigKey key) {
+ logger.trace("Searching configuration [{}] of account [{}] in its settings.", key.key(), accountVO);
+ AccountDetailVO accountDetail = accountDetailsDao.findDetail(accountVO.getAccountId(), key.key());
+ if (accountDetail != null) {
+ boolean result = Boolean.parseBoolean(accountDetail.getValue());
+ logger.trace("Using value [{}] found in account [{}] settings to configuration [{}].", result, accountVO, key.key());
+ return result;
+ }
+
+ if (Boolean.parseBoolean(_configDao.getValue("enable.account.settings.for.domain"))) {
+ logger.trace("Searching for configuration [{}] of account [{}] in its domain [{}] settings.", key.key(), accountVO, accountVO.getDomainId());
+ DomainDetailVO domainDetail = domainDetailsDao.findDetail(accountVO.getDomainId(), key.key());
+ if (domainDetail != null) {
+ boolean result = Boolean.parseBoolean(domainDetail.getValue());
+ logger.trace("Using value [{}] found in domain [{}] settings to configuration [{}].", result, accountVO.getDomainId(), key.key());
+ return result;
+ }
+ }
+ boolean result = Boolean.parseBoolean(getConfigValueOrDefaultValue(key));
+ logger.trace("Using default value [{}] to configuration [{}].", result, key.key());
+ return result;
+ }
+
+ protected String getConfigValueOrDefaultValue(ConfigKey> key) {
+ return ObjectUtils.defaultIfNull(_configDao.getValue(key.key()), key.defaultValue());
}
protected List persistUsagesAndQuotaUsagesAndRetrievePersistedQuotaUsages(List> pairsUsageAndQuotaUsage) {
diff --git a/framework/quota/src/test/java/org/apache/cloudstack/quota/QuotaAlertManagerImplTest.java b/framework/quota/src/test/java/org/apache/cloudstack/quota/QuotaAlertManagerImplTest.java
index 54d4f1d5b690..4259c355de64 100644
--- a/framework/quota/src/test/java/org/apache/cloudstack/quota/QuotaAlertManagerImplTest.java
+++ b/framework/quota/src/test/java/org/apache/cloudstack/quota/QuotaAlertManagerImplTest.java
@@ -33,7 +33,6 @@
import org.apache.cloudstack.quota.dao.QuotaEmailConfigurationDaoImpl;
import org.apache.cloudstack.quota.dao.QuotaEmailTemplatesDao;
import org.apache.cloudstack.quota.vo.QuotaAccountVO;
-import org.apache.cloudstack.quota.vo.QuotaEmailConfigurationVO;
import org.apache.cloudstack.quota.vo.QuotaEmailTemplatesVO;
import org.junit.Assert;
import org.junit.Before;
@@ -116,9 +115,6 @@ public void setup() throws IllegalAccessException, NoSuchFieldException, Configu
@Test
public void isQuotaEmailTypeEnabledForAccountTestConfigurationIsEnabledAndEmailIsConfiguredReturnConfiguredValue() {
boolean expectedValue = !QuotaConfig.QuotaEnableEmails.value();
- QuotaEmailConfigurationVO quotaEmailConfigurationVoMock = Mockito.mock(QuotaEmailConfigurationVO.class);
- Mockito.when(quotaEmailConfigurationVoMock.isEnabled()).thenReturn(expectedValue);
- Mockito.doReturn(quotaEmailConfigurationVoMock).when(quotaEmailConfigurationDaoMock).findByAccountIdAndEmailTemplateType(Mockito.anyLong(), Mockito.any(QuotaConfig.QuotaEmailTemplateTypes.class));
boolean result = quotaAlertManager.isQuotaEmailTypeEnabledForAccount(accountMock, QuotaConfig.QuotaEmailTemplateTypes.QUOTA_EMPTY);
@@ -129,6 +125,8 @@ public void isQuotaEmailTypeEnabledForAccountTestConfigurationIsEnabledAndEmailI
public void isQuotaEmailTypeEnabledForAccountTestConfigurationIsEnabledAndEmailIsNotConfiguredReturnDefaultValue() {
boolean defaultValue = QuotaConfig.QuotaEnableEmails.value();
+ Mockito.when(quotaManagerMock.findConfigurationValue(accountMock, QuotaConfig.QuotaEnableEmails)).thenReturn(true);
+
boolean result = quotaAlertManager.isQuotaEmailTypeEnabledForAccount(accountMock, QuotaConfig.QuotaEmailTemplateTypes.QUOTA_EMPTY);
Assert.assertEquals(defaultValue, result);