diff --git a/plugins/database/quota/src/org/apache/cloudstack/api/response/QuotaResponseBuilderImpl.java b/plugins/database/quota/src/org/apache/cloudstack/api/response/QuotaResponseBuilderImpl.java index 50d1cf60eef..4fd390bdbbf 100644 --- a/plugins/database/quota/src/org/apache/cloudstack/api/response/QuotaResponseBuilderImpl.java +++ b/plugins/database/quota/src/org/apache/cloudstack/api/response/QuotaResponseBuilderImpl.java @@ -36,6 +36,7 @@ import org.apache.cloudstack.quota.dao.QuotaBalanceDao; import org.apache.cloudstack.quota.dao.QuotaCreditsDao; import org.apache.cloudstack.quota.dao.QuotaEmailTemplatesDao; import org.apache.cloudstack.quota.dao.QuotaTariffDao; +import org.apache.cloudstack.quota.job.QuotaManager; import org.apache.cloudstack.quota.vo.QuotaBalanceVO; import org.apache.cloudstack.quota.vo.QuotaCreditsVO; import org.apache.cloudstack.quota.vo.QuotaEmailTemplatesVO; @@ -76,6 +77,8 @@ public class QuotaResponseBuilderImpl implements QuotaResponseBuilder { @Inject private QuotaService _quotaService; @Inject + private QuotaManager _quotaMgr; + @Inject AccountDao _accountDao; @Inject private RegionManager _regionMgr; @@ -282,10 +285,12 @@ public class QuotaResponseBuilderImpl implements QuotaResponseBuilder { TransactionLegacy.open(TransactionLegacy.CLOUD_DB).close(); final AccountVO account = _accountDao.findById(accountId); final boolean lockAccountEnforcement = QuotaConfig.QuotaEnableEnforcement.value().equalsIgnoreCase("true"); - if (lockAccountEnforcement && (_quotaBalanceDao.lastQuotaBalance(accountId, domainId, new Date()).compareTo(new BigDecimal(0)) >= 0)) { + final BigDecimal currentAccountBalance = _quotaBalanceDao.lastQuotaBalance(accountId, domainId, new Date()); + if (lockAccountEnforcement && (currentAccountBalance.compareTo(new BigDecimal(0)) >= 0)) { if (account.getState() == Account.State.locked) { try { _regionMgr.enableAccount(account.getAccountName(), domainId, accountId); + _quotaMgr.sendQuotaAlert(account, currentAccountBalance, QuotaConfig.QuotaEmailTemplateTypes.QUOTA_UNLOCK_ACCOUNT); } catch (Exception e) { s_logger.error(String.format("Unable to unlock account %s after getting enough quota credits", account.getAccountName())); } diff --git a/plugins/database/quota/src/org/apache/cloudstack/quota/constant/QuotaConfig.java b/plugins/database/quota/src/org/apache/cloudstack/quota/constant/QuotaConfig.java index 75d0b996735..b31f05e069f 100644 --- a/plugins/database/quota/src/org/apache/cloudstack/quota/constant/QuotaConfig.java +++ b/plugins/database/quota/src/org/apache/cloudstack/quota/constant/QuotaConfig.java @@ -69,6 +69,6 @@ public interface QuotaConfig { "Sender of quota alert email (will be in the From header of the email)", true); enum QuotaEmailTemplateTypes { - QUOTA_LOW, QUOTA_EMPTY + QUOTA_LOW, QUOTA_EMPTY, QUOTA_UNLOCK_ACCOUNT } } \ No newline at end of file diff --git a/plugins/database/quota/src/org/apache/cloudstack/quota/job/QuotaManager.java b/plugins/database/quota/src/org/apache/cloudstack/quota/job/QuotaManager.java index 34879a9c345..3cd302e4de5 100644 --- a/plugins/database/quota/src/org/apache/cloudstack/quota/job/QuotaManager.java +++ b/plugins/database/quota/src/org/apache/cloudstack/quota/job/QuotaManager.java @@ -16,10 +16,15 @@ //under the License. package org.apache.cloudstack.quota.job; +import com.cloud.user.AccountVO; import com.cloud.utils.component.Manager; +import org.apache.cloudstack.quota.constant.QuotaConfig; + +import java.math.BigDecimal; public interface QuotaManager extends Manager { boolean calculateQuotaUsage(); + void sendQuotaAlert(AccountVO account, BigDecimal balance, QuotaConfig.QuotaEmailTemplateTypes emailType); } diff --git a/plugins/database/quota/src/org/apache/cloudstack/quota/job/QuotaManagerImpl.java b/plugins/database/quota/src/org/apache/cloudstack/quota/job/QuotaManagerImpl.java index c742fd06f81..855c3d69c0d 100644 --- a/plugins/database/quota/src/org/apache/cloudstack/quota/job/QuotaManagerImpl.java +++ b/plugins/database/quota/src/org/apache/cloudstack/quota/job/QuotaManagerImpl.java @@ -442,7 +442,7 @@ public class QuotaManagerImpl extends ManagerBase implements QuotaManager { return quota_usage; } - private void sendQuotaAlert(AccountVO account, BigDecimal balance, QuotaConfig.QuotaEmailTemplateTypes emailType) { + public void sendQuotaAlert(AccountVO account, BigDecimal balance, QuotaConfig.QuotaEmailTemplateTypes emailType) { sendQuotaAlert(new DeferredQuotaEmail(account, balance, emailType)); } diff --git a/setup/db/db/schema-451to452.sql b/setup/db/db/schema-451to452.sql index 041d0e5d3a4..697004663fc 100644 --- a/setup/db/db/schema-451to452.sql +++ b/setup/db/db/schema-451to452.sql @@ -128,8 +128,9 @@ CREATE TABLE IF NOT EXISTS `cloud_usage`.`quota_email_templates` ( LOCK TABLES `cloud_usage`.`quota_email_templates` WRITE; INSERT INTO `cloud_usage`.`quota_email_templates` (`template_name`, `template_subject`, `template_body`) VALUES - ('QUOTA_LOW', 'Quota Usage Threshold crossed ${accountName}', 'Your account "${accountName}" in the domain "${domainName}" has reached usage threshold, the current balance is ${quotaCurrency} ${quotaValue}'), - ('QUOTA_EMPTY', 'Quota Exhausted, account ${accountName} is locked now', 'Your account "${accountName}" in the domain "${domainName}" has exhausted allocated quota due to which your account has locked now, please contact the administrator'); + ('QUOTA_LOW', 'Quota Usage Threshold crossed by your account ${accountName}', 'Your account ${accountName} in the domain ${domainName} has reached quota usage threshold, your current quota balance is ${quotaBalance}.'), + ('QUOTA_EMPTY', 'Quota Exhausted, account ${accountName} is locked now', 'Your account ${accountName} in the domain ${domainName} has exhausted allocated quota and has been locked now, please contact the administrator.'), + ('QUOTA_UNLOCK_ACCOUNT', 'Quota credits added, account ${accountName} is unlocked now', 'Your account ${accountName} in the domain ${domainName} has enough quota credits now with the current balance of ${quotaBalance}. Your account has been unlocked now.'); UNLOCK TABLES; CREATE TABLE IF NOT EXISTS `cloud_usage`.`quota_sent_emails` ( diff --git a/ui/plugins/quota/quota.js b/ui/plugins/quota/quota.js index fabbb5e0475..4120b74abc4 100644 --- a/ui/plugins/quota/quota.js +++ b/ui/plugins/quota/quota.js @@ -587,7 +587,7 @@ var g_quotaCurrency = ''; var emailTemplateForm = $('
Select Template:
').appendTo(templateDropdown)); $('