CLOUDSTACK-8592: Report quotaSummary command returns quota balance, quota usage and

state for all account.
This commit is contained in:
Abhinandan Prateek 2015-11-05 14:19:16 +05:30
parent d9e3b4c922
commit db3c1bbd79
4 changed files with 182 additions and 5 deletions

View File

@ -16,8 +16,11 @@
//under the License.
package org.apache.cloudstack.quota;
import java.util.Calendar;
import com.cloud.utils.component.Manager;
public interface QuotaStatement extends Manager {
void sendStatement();
Calendar[] getCurrentStatementTime();
}

View File

@ -143,6 +143,122 @@ public class QuotaStatementImpl extends ManagerBase implements QuotaStatement {
}
}
@Override
public Calendar[] getCurrentStatementTime() {
final Calendar today = Calendar.getInstance();
int day_of_month = today.get(Calendar.DAY_OF_MONTH);
int month_of_year = today.get(Calendar.MONTH);
Calendar firstDateOfCurrentPeriod, lastDateOfCurrentPeriod;
Calendar aCalendar = (Calendar)today.clone();
aCalendar.add(Calendar.DATE, 1);
aCalendar.set(Calendar.HOUR, 0);
aCalendar.set(Calendar.MINUTE, 0);
aCalendar.set(Calendar.SECOND, 0);
lastDateOfCurrentPeriod = aCalendar;
switch (_period) {
case BIMONTHLY:
if (day_of_month < 16) {
aCalendar = (Calendar)today.clone();
aCalendar.add(Calendar.MONTH, 0);
aCalendar.set(Calendar.DATE, 1);
aCalendar.set(Calendar.HOUR, 0);
aCalendar.set(Calendar.MINUTE, 0);
aCalendar.set(Calendar.SECOND, 0);
firstDateOfCurrentPeriod = aCalendar;
return new Calendar[] {firstDateOfCurrentPeriod, lastDateOfCurrentPeriod};
} else {
aCalendar = (Calendar)today.clone();
aCalendar.set(Calendar.DATE, 16);
aCalendar.set(Calendar.HOUR, 0);
aCalendar.set(Calendar.MINUTE, 0);
aCalendar.set(Calendar.SECOND, 0);
firstDateOfCurrentPeriod = aCalendar;
return new Calendar[] {firstDateOfCurrentPeriod, lastDateOfCurrentPeriod};
}
case MONTHLY:
aCalendar = (Calendar)today.clone();
aCalendar.set(Calendar.DATE, 1);
aCalendar.set(Calendar.HOUR, 0);
aCalendar.set(Calendar.MINUTE, 0);
aCalendar.set(Calendar.SECOND, 0);
firstDateOfCurrentPeriod = aCalendar;
return new Calendar[] {firstDateOfCurrentPeriod, lastDateOfCurrentPeriod};
case QUATERLY:
if (month_of_year < Calendar.APRIL) {
aCalendar = (Calendar)today.clone();
aCalendar.set(Calendar.MONTH, Calendar.JANUARY);
aCalendar.set(Calendar.DATE, 1);
aCalendar.set(Calendar.HOUR, 0);
aCalendar.set(Calendar.MINUTE, 0);
aCalendar.set(Calendar.SECOND, 0);
firstDateOfCurrentPeriod = aCalendar;
return new Calendar[] {firstDateOfCurrentPeriod, lastDateOfCurrentPeriod};
} else if (month_of_year < Calendar.JULY) {
aCalendar = (Calendar)today.clone();
aCalendar.set(Calendar.MONTH, Calendar.APRIL);
aCalendar.set(Calendar.DATE, 1);
aCalendar.set(Calendar.HOUR, 0);
aCalendar.set(Calendar.MINUTE, 0);
aCalendar.set(Calendar.SECOND, 0);
firstDateOfCurrentPeriod = aCalendar;
return new Calendar[] {firstDateOfCurrentPeriod, lastDateOfCurrentPeriod};
} else if (month_of_year < Calendar.OCTOBER) {
aCalendar = (Calendar)today.clone();
aCalendar.set(Calendar.MONTH, Calendar.JULY);
aCalendar.set(Calendar.DATE, 1);
aCalendar.set(Calendar.HOUR, 0);
aCalendar.set(Calendar.MINUTE, 0);
aCalendar.set(Calendar.SECOND, 0);
firstDateOfCurrentPeriod = aCalendar;
return new Calendar[] {firstDateOfCurrentPeriod, lastDateOfCurrentPeriod};
} else {
aCalendar = (Calendar)today.clone();
aCalendar.set(Calendar.MONTH, Calendar.OCTOBER);
aCalendar.set(Calendar.DATE, 1);
aCalendar.set(Calendar.HOUR, 0);
aCalendar.set(Calendar.MINUTE, 0);
aCalendar.set(Calendar.SECOND, 0);
firstDateOfCurrentPeriod = aCalendar;
return new Calendar[] {firstDateOfCurrentPeriod, lastDateOfCurrentPeriod};
}
case HALFYEARLY:
// statements are sent in Jan=1, Jul 7,
if (month_of_year < Calendar.JULY) {
aCalendar = (Calendar)today.clone();
aCalendar.set(Calendar.MONTH, Calendar.JANUARY);
aCalendar.set(Calendar.DATE, 1);
aCalendar.set(Calendar.HOUR, 0);
aCalendar.set(Calendar.MINUTE, 0);
aCalendar.set(Calendar.SECOND, 0);
firstDateOfCurrentPeriod = aCalendar;
return new Calendar[] {firstDateOfCurrentPeriod, lastDateOfCurrentPeriod};
} else {
aCalendar = (Calendar)today.clone();
aCalendar.set(Calendar.MONTH, Calendar.JULY);
aCalendar.set(Calendar.DATE, 1);
aCalendar.set(Calendar.HOUR, 0);
aCalendar.set(Calendar.MINUTE, 0);
aCalendar.set(Calendar.SECOND, 0);
firstDateOfCurrentPeriod = aCalendar;
return new Calendar[] {firstDateOfCurrentPeriod, lastDateOfCurrentPeriod};
}
case YEARLY:
aCalendar = (Calendar)today.clone();
aCalendar.add(Calendar.MONTH, Calendar.JANUARY);
aCalendar.set(Calendar.DATE, 1);
aCalendar.set(Calendar.HOUR, 0);
aCalendar.set(Calendar.MINUTE, 0);
aCalendar.set(Calendar.SECOND, 0);
firstDateOfCurrentPeriod = aCalendar;
return new Calendar[] {firstDateOfCurrentPeriod, lastDateOfCurrentPeriod};
default:
break;
}
return null;
}
public Calendar[] statementTime(final Calendar today, final STATEMENT_PERIODS period) {
//check if it is statement time
int day_of_month = today.get(Calendar.DAY_OF_MONTH);
@ -226,7 +342,7 @@ public class QuotaStatementImpl extends ManagerBase implements QuotaStatement {
return null;
case YEARLY:
// statements are sent in Jan=1
if (month_of_year == Calendar.JANUARY ) {
if (month_of_year == Calendar.JANUARY) {
if (day_of_month < s_LAST_STATEMENT_SENT_DAYS) {
Calendar aCalendar = (Calendar)today.clone();
aCalendar.add(Calendar.MONTH, -12);

View File

@ -16,8 +16,11 @@
//under the License.
package org.apache.cloudstack.api.response;
import com.cloud.domain.DomainVO;
import com.cloud.domain.dao.DomainDao;
import com.cloud.exception.InvalidParameterValueException;
import com.cloud.user.Account;
import com.cloud.user.Account.State;
import com.cloud.user.AccountVO;
import com.cloud.user.User;
import com.cloud.user.dao.AccountDao;
@ -30,12 +33,16 @@ import org.apache.cloudstack.api.command.QuotaStatementCmd;
import org.apache.cloudstack.api.command.QuotaTariffListCmd;
import org.apache.cloudstack.api.command.QuotaTariffUpdateCmd;
import org.apache.cloudstack.quota.QuotaService;
import org.apache.cloudstack.quota.QuotaStatement;
import org.apache.cloudstack.quota.constant.QuotaConfig;
import org.apache.cloudstack.quota.constant.QuotaTypes;
import org.apache.cloudstack.quota.dao.QuotaAccountDao;
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.dao.QuotaUsageDao;
import org.apache.cloudstack.quota.vo.QuotaAccountVO;
import org.apache.cloudstack.quota.vo.QuotaBalanceVO;
import org.apache.cloudstack.quota.vo.QuotaCreditsVO;
import org.apache.cloudstack.quota.vo.QuotaEmailTemplatesVO;
@ -72,6 +79,8 @@ public class QuotaResponseBuilderImpl implements QuotaResponseBuilder {
@Inject
private QuotaCreditsDao _quotaCreditsDao;
@Inject
private QuotaUsageDao _quotaUsageDao;
@Inject
private QuotaEmailTemplatesDao _quotaEmailTemplateDao;
@Inject
@ -79,9 +88,15 @@ public class QuotaResponseBuilderImpl implements QuotaResponseBuilder {
@Inject
private QuotaService _quotaService;
@Inject
AccountDao _accountDao;
private AccountDao _accountDao;
@Inject
private DomainDao _domainDao;
@Inject
private RegionManager _regionMgr;
@Inject
private QuotaAccountDao _quotaAcc;
@Inject
private QuotaStatement _statement;
@Override
public QuotaTariffResponse createQuotaTariffResponse(QuotaTariffVO tariff) {
@ -100,6 +115,25 @@ public class QuotaResponseBuilderImpl implements QuotaResponseBuilder {
@Override
public List<QuotaSummaryResponse> createQuotaSummaryResponse() {
List<QuotaSummaryResponse> result = new ArrayList<QuotaSummaryResponse>();
Calendar[] period = _statement.getCurrentStatementTime();
for (final QuotaAccountVO quotaAccount : _quotaAcc.listAllQuotaAccount()) {
QuotaSummaryResponse qr = new QuotaSummaryResponse();
AccountVO account = _accountDao.findById(quotaAccount.getId());
DomainVO domain = _domainDao.findById(account.getDomainId());
BigDecimal curBalance = _quotaBalanceDao.lastQuotaBalance(account.getAccountId(), account.getDomainId(), period[1].getTime());
BigDecimal quotaUsage = _quotaUsageDao.findTotalQuotaUsage(account.getAccountId(), account.getDomainId(), null, period[0].getTime(), period[1].getTime());
qr.setAccountId(account.getAccountId());
qr.setAccountName(account.getAccountName());
qr.setDomainId(account.getDomainId());
qr.setDomainName(domain.getName());
qr.setBalance(curBalance);
qr.setQuotaUsage(quotaUsage);
qr.setState(account.getState().compareTo(State.enabled) == 0);
result.add(qr);
}
return result;
}

View File

@ -36,14 +36,22 @@ public class QuotaSummaryResponse extends BaseResponse {
@Param(description = "account name")
private String accountName;
@SerializedName("domain")
@SerializedName("domainid")
@Param(description = "domain id")
private Long domainId;
@SerializedName("domain")
@Param(description = "domain name")
private String domainName;
@SerializedName("balance")
@Param(description = "account balance")
private BigDecimal balance;
@SerializedName("state")
@Param(description = "account state")
private Boolean state;
@SerializedName("quota")
@Param(description = "quota usage of this period")
private BigDecimal quotaUsage;
@ -88,10 +96,26 @@ public class QuotaSummaryResponse extends BaseResponse {
this.domainId = domainId;
}
public String getDomainName() {
return domainName;
}
public void setDomainName(String domainName) {
this.domainName = domainName;
}
public BigDecimal getQuotaUsage() {
return quotaUsage;
}
public Boolean getState() {
return state;
}
public void setState(Boolean state) {
this.state = state;
}
public void setQuotaUsage(BigDecimal startQuota) {
this.quotaUsage = startQuota.setScale(2, RoundingMode.HALF_EVEN);
}
@ -100,8 +124,8 @@ public class QuotaSummaryResponse extends BaseResponse {
return balance;
}
public void setBalance(BigDecimal endQuota) {
this.balance = endQuota.setScale(2, RoundingMode.HALF_EVEN);
public void setBalance(BigDecimal balance) {
this.balance = balance.setScale(2, RoundingMode.HALF_EVEN);
}
public Date getStartDate() {