bug 10848: Introducing an api - ListCapacityByType. Add the basic DB layer in the command.

This commit is contained in:
Nitin 2011-08-09 18:12:37 +05:30
parent bf13273889
commit d763d809cc
4 changed files with 68 additions and 4 deletions

View File

@ -52,7 +52,7 @@ public class ListCapacityByTypeCmd extends BaseListCmd {
@Parameter(name=ApiConstants.POD_ID, type=CommandType.LONG, description="lists capacity by the Pod ID")
private Long podId;
@Parameter(name=ApiConstants.ZONE_ID, type=CommandType.LONG, description="lists capacity by the Zone ID")
@Parameter(name=ApiConstants.ZONE_ID, type=CommandType.LONG, required=true, description="lists capacity by the Zone ID")
private Long zoneId;

View File

@ -21,6 +21,7 @@ package com.cloud.capacity.dao;
import java.util.List;
import com.cloud.capacity.CapacityVO;
import com.cloud.capacity.dao.CapacityDaoImpl.SummedCapacity;
import com.cloud.utils.db.GenericDao;
public interface CapacityDao extends GenericDao<CapacityVO, Long> {
@ -29,5 +30,7 @@ public interface CapacityDao extends GenericDao<CapacityVO, Long> {
CapacityVO findByHostIdType(Long hostId, short capacityType);
void clearNonStorageCapacities2();
List<Long> orderClustersInZoneOrPodByHostCapacities(long id, int requiredCpu, long requiredRam, short capacityTypeForOrdering, boolean isZone, float cpuOverprovisioningFactor);
List<Long> listHostsWithEnoughCapacity(int requiredCpu, long requiredRam, Long clusterId, String hostType, float cpuOverprovisioningFactor);
List<Long> listHostsWithEnoughCapacity(int requiredCpu, long requiredRam, Long clusterId, String hostType, float cpuOverprovisioningFactor);
List<SummedCapacity> findCapacityByType(short capacityType, Long zoneId, Long podId,
Long clusterId, Long startIndex, Long pageSize);
}

View File

@ -29,10 +29,17 @@ import javax.ejb.Local;
import org.apache.log4j.Logger;
import com.cloud.capacity.CapacityVO;
import com.cloud.storage.VolumeVO;
import com.cloud.storage.dao.VolumeDaoImpl.SumCount;
import com.cloud.utils.Pair;
import com.cloud.utils.db.Filter;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.GenericSearchBuilder;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.Transaction;
import com.cloud.utils.db.SearchCriteria.Func;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.exception.CloudRuntimeException;
@Local(value = { CapacityDao.class })
@ -53,6 +60,7 @@ public class CapacityDaoImpl extends GenericDaoBase<CapacityVO, Long> implements
private SearchBuilder<CapacityVO> _hostIdTypeSearch;
private SearchBuilder<CapacityVO> _hostOrPoolIdSearch;
protected GenericSearchBuilder<CapacityVO, SummedCapacity> SummedCapactySearch;
private static final String LIST_HOSTS_IN_CLUSTER_WITH_ENOUGH_CAPACITY = "SELECT a.host_id FROM (host JOIN op_host_capacity a ON host.id = a.host_id AND host.cluster_id = ? AND host.type = ? " +
"AND (a.total_capacity * ? - a.used_capacity) >= ? and a.capacity_type = 1) " +
@ -68,6 +76,44 @@ public class CapacityDaoImpl extends GenericDaoBase<CapacityVO, Long> implements
_hostOrPoolIdSearch.and("hostId", _hostOrPoolIdSearch.entity().getHostOrPoolId(), SearchCriteria.Op.EQ);
_hostOrPoolIdSearch.done();
}
@Override
public List<SummedCapacity> findCapacityByType(short capacityType, Long zoneId, Long podId, Long clusterId, Long startIndex, Long pageSize){
SummedCapactySearch = createSearchBuilder(SummedCapacity.class);
SummedCapactySearch.select("sumUsed", Func.SUM, SummedCapactySearch.entity().getUsedCapacity());
SummedCapactySearch.select("sumTotal", Func.SUM, SummedCapactySearch.entity().getTotalCapacity());
SummedCapactySearch.select("clusterId", Func.NATIVE, SummedCapactySearch.entity().getClusterId());
SummedCapactySearch.select("podId", Func.NATIVE, SummedCapactySearch.entity().getPodId());
SummedCapactySearch.and("dcId", SummedCapactySearch.entity().getDataCenterId(), Op.EQ);
SummedCapactySearch.and("capacityType", SummedCapactySearch.entity().getCapacityType(), Op.EQ);
SummedCapactySearch.groupBy(SummedCapactySearch.entity().getClusterId());
if (podId != null){
SummedCapactySearch.and("podId", SummedCapactySearch.entity().getPodId(), Op.EQ);
}
if (clusterId != null){
SummedCapactySearch.and("clusterId", SummedCapactySearch.entity().getClusterId(), Op.EQ);
}
SummedCapactySearch.done();
SearchCriteria<SummedCapacity> sc = SummedCapactySearch.create();
sc.setParameters("dcId", zoneId);
sc.setParameters("capacityType", capacityType);
if (podId != null){
sc.setParameters("podId", podId);
}
if (clusterId != null){
sc.setParameters("clusterId", clusterId);
}
Filter filter = new Filter(CapacityVO.class, null, true, startIndex, pageSize);
List<SummedCapacity> results = customSearchIncludingRemoved(sc, filter);
return results;
}
public void updateAllocated(Long hostId, long allocatedAmount, short capacityType, boolean add) {
Transaction txn = Transaction.currentTxn();
@ -231,5 +277,14 @@ public class CapacityDaoImpl extends GenericDaoBase<CapacityVO, Long> implements
} catch (Throwable e) {
throw new CloudRuntimeException("Caught: " + sql, e);
}
}
}
public static class SummedCapacity {
public long sumUsed;
public long sumTotal;
public long clusterId;
public long podId;
public SummedCapacity() {
}
}
}

View File

@ -126,6 +126,7 @@ import com.cloud.async.dao.AsyncJobDao;
import com.cloud.capacity.Capacity;
import com.cloud.capacity.CapacityVO;
import com.cloud.capacity.dao.CapacityDao;
import com.cloud.capacity.dao.CapacityDaoImpl.SummedCapacity;
import com.cloud.configuration.Config;
import com.cloud.configuration.ConfigurationManager;
import com.cloud.configuration.ConfigurationVO;
@ -3221,7 +3222,12 @@ public class ManagementServerImpl implements ManagementServer {
@Override
public List<CapacityVO> listCapacityByType(ListCapacityByTypeCmd cmd) {
return null;
List<SummedCapacity> results = _capacityDao.findCapacityByType(cmd.getType().shortValue(), cmd.getZoneId(), cmd.getPodId(), cmd.getClusterId(), cmd.getStartIndex(), cmd.getPageSizeVal());
for (SummedCapacity sum : results){
s_logger.info("Total - " +sum.sumTotal+ " Used - " +sum.sumUsed+ " cluster " +sum.clusterId+ " pod " +sum.podId);
}
return null;
}