From d763d809ccb833bb58fc139981426d23db4330fe Mon Sep 17 00:00:00 2001 From: Nitin Date: Tue, 9 Aug 2011 18:12:37 +0530 Subject: [PATCH] bug 10848: Introducing an api - ListCapacityByType. Add the basic DB layer in the command. --- .../api/commands/ListCapacityByTypeCmd.java | 2 +- .../com/cloud/capacity/dao/CapacityDao.java | 5 +- .../cloud/capacity/dao/CapacityDaoImpl.java | 57 ++++++++++++++++++- .../cloud/server/ManagementServerImpl.java | 8 ++- 4 files changed, 68 insertions(+), 4 deletions(-) diff --git a/api/src/com/cloud/api/commands/ListCapacityByTypeCmd.java b/api/src/com/cloud/api/commands/ListCapacityByTypeCmd.java index df2d25ae16e..9b1efc094ae 100755 --- a/api/src/com/cloud/api/commands/ListCapacityByTypeCmd.java +++ b/api/src/com/cloud/api/commands/ListCapacityByTypeCmd.java @@ -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; diff --git a/server/src/com/cloud/capacity/dao/CapacityDao.java b/server/src/com/cloud/capacity/dao/CapacityDao.java index f43e9f458cd..080a7a64e66 100755 --- a/server/src/com/cloud/capacity/dao/CapacityDao.java +++ b/server/src/com/cloud/capacity/dao/CapacityDao.java @@ -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 { @@ -29,5 +30,7 @@ public interface CapacityDao extends GenericDao { CapacityVO findByHostIdType(Long hostId, short capacityType); void clearNonStorageCapacities2(); List orderClustersInZoneOrPodByHostCapacities(long id, int requiredCpu, long requiredRam, short capacityTypeForOrdering, boolean isZone, float cpuOverprovisioningFactor); - List listHostsWithEnoughCapacity(int requiredCpu, long requiredRam, Long clusterId, String hostType, float cpuOverprovisioningFactor); + List listHostsWithEnoughCapacity(int requiredCpu, long requiredRam, Long clusterId, String hostType, float cpuOverprovisioningFactor); + List findCapacityByType(short capacityType, Long zoneId, Long podId, + Long clusterId, Long startIndex, Long pageSize); } diff --git a/server/src/com/cloud/capacity/dao/CapacityDaoImpl.java b/server/src/com/cloud/capacity/dao/CapacityDaoImpl.java index 7fffdb61fd2..6633aceeb61 100755 --- a/server/src/com/cloud/capacity/dao/CapacityDaoImpl.java +++ b/server/src/com/cloud/capacity/dao/CapacityDaoImpl.java @@ -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 implements private SearchBuilder _hostIdTypeSearch; private SearchBuilder _hostOrPoolIdSearch; + protected GenericSearchBuilder 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 implements _hostOrPoolIdSearch.and("hostId", _hostOrPoolIdSearch.entity().getHostOrPoolId(), SearchCriteria.Op.EQ); _hostOrPoolIdSearch.done(); } + + @Override + public List 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 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 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 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() { + } + } } diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 68a790dac45..3b61e83f072 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -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 listCapacityByType(ListCapacityByTypeCmd cmd) { - return null; + + List 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; }