diff --git a/framework/quota/src/org/apache/cloudstack/quota/QuotaAlertManagerImpl.java b/framework/quota/src/org/apache/cloudstack/quota/QuotaAlertManagerImpl.java index adc36b24142..afa7cfe3198 100644 --- a/framework/quota/src/org/apache/cloudstack/quota/QuotaAlertManagerImpl.java +++ b/framework/quota/src/org/apache/cloudstack/quota/QuotaAlertManagerImpl.java @@ -140,7 +140,6 @@ public class QuotaAlertManagerImpl extends ManagerBase implements QuotaAlertMana @Override public void checkAndSendQuotaAlertEmails() { - s_logger.info("Running checkAndSendQuotaAlertEmails"); List deferredQuotaEmailList = new ArrayList(); final BigDecimal zeroBalance = new BigDecimal(0); for (final QuotaAccountVO quotaAccount : _quotaAcc.listAllQuotaAccount()) { @@ -153,20 +152,22 @@ public class QuotaAlertManagerImpl extends ManagerBase implements QuotaAlertMana if (accountBalance != null) { AccountVO account = _accountDao.findById(quotaAccount.getId()); if (s_logger.isDebugEnabled()) { - s_logger.debug("Check id " + account.getId() + " bal=" + accountBalance + " alertDate" + alertDate + " current date" + new Date()); + s_logger.debug("checkAndSendQuotaAlertEmails: Check id=" + account.getId() + " bal=" + accountBalance + ", alertDate=" + alertDate + ", lockable=" + lockable); } if (accountBalance.compareTo(zeroBalance) < 0) { if (_lockAccountEnforcement && (lockable == 1)) { if (account.getType() == Account.ACCOUNT_TYPE_NORMAL) { - s_logger.info("Locking account " + account.getAccountName() + " due to quota exhasuted."); + s_logger.info("Locking account " + account.getAccountName() + " due to quota < 0."); lockAccount(account.getId()); } } if (alertDate == null || (balanceDate.after(alertDate) && getDifferenceDays(alertDate, new Date()) > 1)) { + s_logger.info("Sending alert " + account.getAccountName() + " due to quota < 0."); deferredQuotaEmailList.add(new DeferredQuotaEmail(account, quotaAccount, QuotaConfig.QuotaEmailTemplateTypes.QUOTA_EMPTY)); } - } else if (accountBalance.compareTo(thresholdBalance) < 0) { + } else if (accountBalance.compareTo(thresholdBalance) <= 0) { if (alertDate == null || (balanceDate.after(alertDate) && getDifferenceDays(alertDate, new Date()) > 1)) { + s_logger.info("Sending alert " + account.getAccountName() + " due to quota below threshold."); deferredQuotaEmailList.add(new DeferredQuotaEmail(account, quotaAccount, QuotaConfig.QuotaEmailTemplateTypes.QUOTA_LOW)); } } @@ -175,7 +176,7 @@ public class QuotaAlertManagerImpl extends ManagerBase implements QuotaAlertMana for (DeferredQuotaEmail emailToBeSent : deferredQuotaEmailList) { if (s_logger.isDebugEnabled()) { - s_logger.debug("Attempting to send quota alert email to users of account: " + emailToBeSent.getAccount().getAccountName()); + s_logger.debug("checkAndSendQuotaAlertEmails: Attempting to send quota alert email to users of account: " + emailToBeSent.getAccount().getAccountName()); } sendQuotaAlert(emailToBeSent); } diff --git a/framework/quota/src/org/apache/cloudstack/quota/QuotaStatementImpl.java b/framework/quota/src/org/apache/cloudstack/quota/QuotaStatementImpl.java index 6cf3828870c..cde3e5af064 100644 --- a/framework/quota/src/org/apache/cloudstack/quota/QuotaStatementImpl.java +++ b/framework/quota/src/org/apache/cloudstack/quota/QuotaStatementImpl.java @@ -151,7 +151,7 @@ public class QuotaStatementImpl extends ManagerBase implements QuotaStatement { switch (period) { case BIMONTHLY: if (day_of_month < s_LAST_STATEMENT_SENT_DAYS) { - Calendar aCalendar = Calendar.getInstance(); + Calendar aCalendar = (Calendar)today.clone(); aCalendar.add(Calendar.MONTH, 0); aCalendar.set(Calendar.DATE, 1); aCalendar.set(Calendar.HOUR, 0); @@ -162,7 +162,7 @@ public class QuotaStatementImpl extends ManagerBase implements QuotaStatement { lastDateOfPreviousPeriod = (Calendar)aCalendar.clone(); return new Calendar[] {firstDateOfPreviousPeriod, lastDateOfPreviousPeriod}; } else if (day_of_month > 15 && (day_of_month - 15) < s_LAST_STATEMENT_SENT_DAYS) { - Calendar aCalendar = Calendar.getInstance(); + Calendar aCalendar = (Calendar)today.clone(); aCalendar.add(Calendar.MONTH, -1); aCalendar.set(Calendar.DATE, 16); aCalendar.set(Calendar.HOUR, 0); @@ -176,7 +176,7 @@ public class QuotaStatementImpl extends ManagerBase implements QuotaStatement { return null; case MONTHLY: if (day_of_month < s_LAST_STATEMENT_SENT_DAYS) { - Calendar aCalendar = Calendar.getInstance(); + Calendar aCalendar = (Calendar)today.clone(); aCalendar.add(Calendar.MONTH, -1); aCalendar.set(Calendar.DATE, 1); aCalendar.set(Calendar.HOUR, 0); @@ -190,16 +190,16 @@ public class QuotaStatementImpl extends ManagerBase implements QuotaStatement { return null; case QUATERLY: // statements are sent in Jan=1, Apr 4, Jul 7, Oct 10 - if (month_of_year == 1 || month_of_year == 4 || month_of_year == 7 || month_of_year == 10) { + if (month_of_year == Calendar.JANUARY || month_of_year == Calendar.APRIL || month_of_year == Calendar.JULY || month_of_year == Calendar.OCTOBER) { if (day_of_month < s_LAST_STATEMENT_SENT_DAYS) { - Calendar aCalendar = Calendar.getInstance(); + Calendar aCalendar = (Calendar)today.clone(); aCalendar.add(Calendar.MONTH, -3); aCalendar.set(Calendar.DATE, 1); aCalendar.set(Calendar.HOUR, 0); aCalendar.set(Calendar.MINUTE, 0); aCalendar.set(Calendar.SECOND, 0); firstDateOfPreviousPeriod = (Calendar)aCalendar.clone(); - aCalendar.add(Calendar.MONTH, -1); + aCalendar.add(Calendar.MONTH, 2); aCalendar.set(Calendar.DATE, aCalendar.getActualMaximum(Calendar.DAY_OF_MONTH) + 1); lastDateOfPreviousPeriod = (Calendar)aCalendar.clone(); return new Calendar[] {firstDateOfPreviousPeriod, lastDateOfPreviousPeriod}; @@ -208,16 +208,16 @@ public class QuotaStatementImpl extends ManagerBase implements QuotaStatement { return null; case HALFYEARLY: // statements are sent in Jan=1, Jul 7, - if (month_of_year == 1 || month_of_year == 7) { + if (month_of_year == Calendar.JANUARY || month_of_year == Calendar.JULY) { if (day_of_month < s_LAST_STATEMENT_SENT_DAYS) { - Calendar aCalendar = Calendar.getInstance(); + Calendar aCalendar = (Calendar)today.clone(); aCalendar.add(Calendar.MONTH, -6); aCalendar.set(Calendar.DATE, 1); aCalendar.set(Calendar.HOUR, 0); aCalendar.set(Calendar.MINUTE, 0); aCalendar.set(Calendar.SECOND, 0); firstDateOfPreviousPeriod = (Calendar)aCalendar.clone(); - aCalendar.add(Calendar.MONTH, -1); + aCalendar.add(Calendar.MONTH, 5); aCalendar.set(Calendar.DATE, aCalendar.getActualMaximum(Calendar.DAY_OF_MONTH) + 1); lastDateOfPreviousPeriod = (Calendar)aCalendar.clone(); return new Calendar[] {firstDateOfPreviousPeriod, lastDateOfPreviousPeriod}; @@ -226,16 +226,16 @@ public class QuotaStatementImpl extends ManagerBase implements QuotaStatement { return null; case YEARLY: // statements are sent in Jan=1 - if (month_of_year == 1) { + if (month_of_year == Calendar.JANUARY ) { if (day_of_month < s_LAST_STATEMENT_SENT_DAYS) { - Calendar aCalendar = Calendar.getInstance(); + Calendar aCalendar = (Calendar)today.clone(); aCalendar.add(Calendar.MONTH, -12); aCalendar.set(Calendar.DATE, 1); aCalendar.set(Calendar.HOUR, 0); aCalendar.set(Calendar.MINUTE, 0); aCalendar.set(Calendar.SECOND, 0); firstDateOfPreviousPeriod = (Calendar)aCalendar.clone(); - aCalendar.add(Calendar.MONTH, -1); + aCalendar.add(Calendar.MONTH, 11); aCalendar.set(Calendar.DATE, aCalendar.getActualMaximum(Calendar.DAY_OF_MONTH) + 1); lastDateOfPreviousPeriod = (Calendar)aCalendar.clone(); return new Calendar[] {firstDateOfPreviousPeriod, lastDateOfPreviousPeriod}; diff --git a/framework/quota/test/org/apache/cloudstack/quota/QuotaStatementTest.java b/framework/quota/test/org/apache/cloudstack/quota/QuotaStatementTest.java index dd91858d450..d1dd7589a5b 100644 --- a/framework/quota/test/org/apache/cloudstack/quota/QuotaStatementTest.java +++ b/framework/quota/test/org/apache/cloudstack/quota/QuotaStatementTest.java @@ -87,7 +87,7 @@ public class QuotaStatementTest extends TestCase { } @Test - public void testStatementPeriod() { + public void testStatementPeriodBIMONTHLY() { Calendar date = Calendar.getInstance(); //BIMONTHLY - first statement of month @@ -104,6 +104,7 @@ public class QuotaStatementTest extends TestCase { assertTrue(period[1].toString(), period[1].get(Calendar.DATE) == 15); //BIMONTHLY - second statement of month + date = Calendar.getInstance(); date.set(Calendar.DATE, QuotaStatementImpl.s_LAST_STATEMENT_SENT_DAYS + 16); period = quotaStatement.statementTime(date, STATEMENT_PERIODS.BIMONTHLY); assertTrue(period == null); @@ -122,9 +123,17 @@ public class QuotaStatementTest extends TestCase { assertTrue(period[1].toString(), period[1].get(Calendar.DATE) == aCalendar.get(Calendar.DATE)); + } + + @Test + public void testStatementPeriodMONTHLY() { + Calendar date = Calendar.getInstance(); + Calendar aCalendar = Calendar.getInstance(); + //MONTHLY + date = Calendar.getInstance(); date.set(Calendar.DATE, QuotaStatementImpl.s_LAST_STATEMENT_SENT_DAYS + 1); - period = quotaStatement.statementTime(date, STATEMENT_PERIODS.MONTHLY); + Calendar period[] = quotaStatement.statementTime(date, STATEMENT_PERIODS.MONTHLY); assertTrue(period == null); //1 of this month @@ -143,6 +152,78 @@ public class QuotaStatementTest extends TestCase { } + @Test + public void testStatementPeriodQUATERLY() { + Calendar date = Calendar.getInstance(); + Calendar aCalendar = Calendar.getInstance(); + + //QUATERLY + date = Calendar.getInstance(); + date.set(Calendar.MONTH, Calendar.JANUARY); // 1 Jan + date.set(Calendar.DATE, 1); + Calendar period[] = quotaStatement.statementTime(date, STATEMENT_PERIODS.QUATERLY); + assertTrue(period != null); + assertTrue("period[0].before(period[1])" + period[0].toString(), period[0].before(period[1])); + assertTrue("period[0].get(Calendar.DATE) == 1" + period[0].toString(), period[0].get(Calendar.DATE) == 1); + assertTrue("period[0].get(Calendar.MONTH) == Calendar.OCTOBER" + period[0].toString(), period[0].get(Calendar.MONTH) == Calendar.OCTOBER); //october + + //get last day of the previous month + aCalendar = Calendar.getInstance(); + aCalendar.set(Calendar.MONTH, Calendar.DECEMBER); + aCalendar.set(Calendar.DATE, aCalendar.getActualMaximum(Calendar.DAY_OF_MONTH) + 1); + assertTrue(" period[1].get(Calendar.DATE) == aCalendar.get(Calendar.DATE)" + period[1].toString(), period[1].get(Calendar.DATE) == aCalendar.get(Calendar.DATE)); + assertTrue("period[1].get(Calendar.MONTH) == aCalendar.get(Calendar.MONTH)" + period[1].toString(), period[1].get(Calendar.MONTH) == aCalendar.get(Calendar.MONTH)); + + } + + @Test + public void testStatementPeriodHALFYEARLY() { + Calendar date = Calendar.getInstance(); + Calendar aCalendar = Calendar.getInstance(); + + //QUATERLY + date = Calendar.getInstance(); + date.set(Calendar.MONTH, Calendar.JANUARY); // 1 Jan + date.set(Calendar.DATE, 1); + Calendar period[] = quotaStatement.statementTime(date, STATEMENT_PERIODS.HALFYEARLY); + assertTrue(period != null); + assertTrue("period[0].before(period[1])" + period[0].toString(), period[0].before(period[1])); + assertTrue("period[0].get(Calendar.DATE) == 1" + period[0].toString(), period[0].get(Calendar.DATE) == 1); + assertTrue("period[0].get(Calendar.MONTH) == Calendar.JULY" + period[0].toString(), period[0].get(Calendar.MONTH) == Calendar.JULY); //july + + //get last day of the previous month + aCalendar = Calendar.getInstance(); + aCalendar.set(Calendar.MONTH, Calendar.DECEMBER); + aCalendar.set(Calendar.DATE, aCalendar.getActualMaximum(Calendar.DAY_OF_MONTH) + 1); + assertTrue(" period[1].get(Calendar.DATE) == aCalendar.get(Calendar.DATE)" + period[1].toString(), period[1].get(Calendar.DATE) == aCalendar.get(Calendar.DATE)); + assertTrue("period[1].get(Calendar.MONTH) == aCalendar.get(Calendar.MONTH)" + period[1].toString(), period[1].get(Calendar.MONTH) == aCalendar.get(Calendar.MONTH)); + + } + + @Test + public void testStatementPeriodYEARLY() { + Calendar date = Calendar.getInstance(); + Calendar aCalendar = Calendar.getInstance(); + + //QUATERLY + date = Calendar.getInstance(); + date.set(Calendar.MONTH, Calendar.JANUARY); // 1 Jan + date.set(Calendar.DATE, 1); + Calendar period[] = quotaStatement.statementTime(date, STATEMENT_PERIODS.YEARLY); + assertTrue("period != null", period != null); + assertTrue("period[0].before(period[1])" + period[0].toString(), period[0].before(period[1])); + assertTrue("period[0].get(Calendar.DATE) == 1" + period[0].toString(), period[0].get(Calendar.DATE) == 1); + assertTrue("period[0].get(Calendar.MONTH) == Calendar.JANUARY" + period[0].toString(), period[0].get(Calendar.MONTH) == Calendar.JANUARY); //january + + //get last day of the previous month + aCalendar = Calendar.getInstance(); + aCalendar.set(Calendar.MONTH, Calendar.DECEMBER); + aCalendar.set(Calendar.DATE, aCalendar.getActualMaximum(Calendar.DAY_OF_MONTH) + 1); + assertTrue(" period[1].get(Calendar.DATE) == aCalendar.get(Calendar.DATE)" + period[1].toString(), period[1].get(Calendar.DATE) == aCalendar.get(Calendar.DATE)); + assertTrue("period[1].get(Calendar.MONTH) == aCalendar.get(Calendar.MONTH)" + period[1].toString(), period[1].get(Calendar.MONTH) == aCalendar.get(Calendar.MONTH)); + + } + @Test public void testSendStatement() { AccountVO accountVO = new AccountVO();