diff --git a/api/src/com/cloud/api/ApiConstants.java b/api/src/com/cloud/api/ApiConstants.java index f95c3d889df..df140410a3f 100755 --- a/api/src/com/cloud/api/ApiConstants.java +++ b/api/src/com/cloud/api/ApiConstants.java @@ -63,6 +63,7 @@ public class ApiConstants { public static final String END_IP = "endip"; public static final String END_PORT = "endport"; public static final String ENTRY_TIME = "entrytime"; + public static final String FETCH_LATEST = "fetchlatest"; public static final String FIRSTNAME = "firstname"; public static final String FORCED = "forced"; public static final String FORCED_DESTROY_LOCAL_STORAGE = "forcedestroylocalstorage"; diff --git a/api/src/com/cloud/api/commands/ListCapacityCmd.java b/api/src/com/cloud/api/commands/ListCapacityCmd.java index ba904ba0018..981c4b381ca 100755 --- a/api/src/com/cloud/api/commands/ListCapacityCmd.java +++ b/api/src/com/cloud/api/commands/ListCapacityCmd.java @@ -53,6 +53,9 @@ public class ListCapacityCmd extends BaseListCmd { @Parameter(name=ApiConstants.CLUSTER_ID, type=CommandType.LONG, description="lists capacity by the Cluster ID") private Long clusterId; + @Parameter(name=ApiConstants.FETCH_LATEST, type=CommandType.BOOLEAN, description="recalculate capacities") + private Boolean fetchLatest; + @Parameter(name=ApiConstants.TYPE, type=CommandType.INTEGER, description="lists capacity by type" + "* CAPACITY_TYPE_MEMORY = 0" + "* CAPACITY_TYPE_CPU = 1" + @@ -80,6 +83,10 @@ public class ListCapacityCmd extends BaseListCmd { return clusterId; } + public Boolean getFetchLatest() { + return fetchLatest; + } + public Integer getType() { return type; } diff --git a/api/src/com/cloud/capacity/Capacity.java b/api/src/com/cloud/capacity/Capacity.java old mode 100644 new mode 100755 index 7d5f5aacb72..75430978146 --- a/api/src/com/cloud/capacity/Capacity.java +++ b/api/src/com/cloud/capacity/Capacity.java @@ -29,6 +29,8 @@ public interface Capacity { public static final short CAPACITY_TYPE_PUBLIC_IP = 4; public static final short CAPACITY_TYPE_PRIVATE_IP = 5; public static final short CAPACITY_TYPE_SECONDARY_STORAGE = 6; + public static final short CAPACITY_TYPE_VLAN = 7; + public long getId(); diff --git a/server/src/com/cloud/alert/AlertManagerImpl.java b/server/src/com/cloud/alert/AlertManagerImpl.java index e7488de7206..831a9864c37 100755 --- a/server/src/com/cloud/alert/AlertManagerImpl.java +++ b/server/src/com/cloud/alert/AlertManagerImpl.java @@ -56,6 +56,7 @@ import com.cloud.dc.HostPodVO; import com.cloud.dc.dao.ClusterDao; import com.cloud.dc.dao.DataCenterDao; import com.cloud.dc.dao.DataCenterIpAddressDao; +import com.cloud.dc.dao.DataCenterVnetDaoImpl; import com.cloud.dc.dao.HostPodDao; import com.cloud.host.Host; import com.cloud.host.HostVO; @@ -83,7 +84,7 @@ import com.sun.mail.smtp.SMTPTransport; public class AlertManagerImpl implements AlertManager { private static final Logger s_logger = Logger.getLogger(AlertManagerImpl.class.getName()); - private static final long INITIAL_CAPACITY_CHECK_DELAY = 30L * 1000L; // five minutes expressed in milliseconds + private static final long INITIAL_CAPACITY_CHECK_DELAY = 30L * 1000L; // thirty seconds expressed in milliseconds private static final DecimalFormat _dfPct = new DecimalFormat("###.##"); private static final DecimalFormat _dfWhole = new DecimalFormat("########"); @@ -269,12 +270,10 @@ public class AlertManagerImpl implements AlertManager { Pair sizes = _volumeDao.getCountAndTotalByPool(pool.getId()); disk = sizes.second(); _storageMgr.createCapacityEntry(pool, disk); - } + } - Transaction txn = Transaction.currentTxn(); - try { - txn.start(); - // Calculate new Public IP capacity + try { + List datacenters = _dcDao.listAll(); for (DataCenterVO datacenter : datacenters) { long dcId = datacenter.getId(); @@ -283,16 +282,22 @@ public class AlertManagerImpl implements AlertManager { //What happens if we have multiple vlans? Dashboard currently shows stats //with no filter based on a vlan //ideal way would be to remove out the vlan param, and filter only on dcId - //implementing the same - + //implementing the same + + // Calculate new Public IP capacity s_logger.trace("Executing public ip capacity update"); createOrUpdateIpCapacity(dcId, null, CapacityVO.CAPACITY_TYPE_PUBLIC_IP); s_logger.trace("Done with public ip capacity update"); - + + //Calculate VLAN's capacity + s_logger.trace("Executing VLAN capacity update"); + createOrUpdateVlanCapacity(dcId); + s_logger.trace("Executing VLAN capacity update"); } - txn.commit(); + + + - txn.start(); // Calculate new Private IP capacity List pods = _podDao.listAll(); for (HostPodVO pod : pods) { @@ -304,16 +309,40 @@ public class AlertManagerImpl implements AlertManager { s_logger.trace("Done with private ip capacity update"); } - txn.commit(); - } catch (Exception ex) { - txn.rollback(); + + } catch (Exception ex) { s_logger.error("Unable to start transaction for capacity update"); - }finally { - txn.close(); } } - public void createOrUpdateIpCapacity(Long dcId, Long podId, short capacityType){ + private void createOrUpdateVlanCapacity(long dcId) { + + SearchCriteria capacitySC = _capacityDao.createSearchCriteria(); + + List capacities = _capacityDao.search(capacitySC, null); + capacitySC = _capacityDao.createSearchCriteria(); + capacitySC.addAnd("dataCenterId", SearchCriteria.Op.EQ, dcId); + capacitySC.addAnd("capacityType", SearchCriteria.Op.EQ, Capacity.CAPACITY_TYPE_VLAN); + capacities = _capacityDao.search(capacitySC, null); + + int totalVlans = _dcDao.countZoneVlans(dcId, false); + int allocatedVlans = _dcDao.countZoneVlans(dcId, true); + + if (capacities.size() == 0){ + CapacityVO newPublicIPCapacity = new CapacityVO(null, dcId, null, null, allocatedVlans, totalVlans, Capacity.CAPACITY_TYPE_VLAN); + _capacityDao.persist(newPublicIPCapacity); + }else if ( !(capacities.get(0).getUsedCapacity() == allocatedVlans + && capacities.get(0).getTotalCapacity() == totalVlans) ){ + CapacityVO capacity = capacities.get(0); + capacity.setUsedCapacity(allocatedVlans); + capacity.setTotalCapacity(totalVlans); + _capacityDao.update(capacity.getId(), capacity); + } + + + } + + public void createOrUpdateIpCapacity(Long dcId, Long podId, short capacityType){ SearchCriteria capacitySC = _capacityDao.createSearchCriteria(); List capacities = _capacityDao.search(capacitySC, null); diff --git a/server/src/com/cloud/dc/dao/DataCenterDao.java b/server/src/com/cloud/dc/dao/DataCenterDao.java old mode 100644 new mode 100755 index ec8588dfbbf..68968252eed --- a/server/src/com/cloud/dc/dao/DataCenterDao.java +++ b/server/src/com/cloud/dc/dao/DataCenterDao.java @@ -75,4 +75,6 @@ public interface DataCenterDao extends GenericDao { List listEnabledZones(); DataCenterVO findByToken(String zoneToken); DataCenterVO findByTokenOrIdOrName(String tokenIdOrName); + + int countZoneVlans(long dcId, boolean onlyCountAllocated); } diff --git a/server/src/com/cloud/dc/dao/DataCenterDaoImpl.java b/server/src/com/cloud/dc/dao/DataCenterDaoImpl.java old mode 100644 new mode 100755 index 1cca111a85c..62595c3dcb8 --- a/server/src/com/cloud/dc/dao/DataCenterDaoImpl.java +++ b/server/src/com/cloud/dc/dao/DataCenterDaoImpl.java @@ -127,6 +127,11 @@ public class DataCenterDaoImpl extends GenericDaoBase implem public List findVnet(long dcId, String vnet) { return _vnetAllocDao.findVnet(dcId, vnet); } + + @Override + public int countZoneVlans(long dcId, boolean onlyCountAllocated){ + return _vnetAllocDao.countZoneVlans(dcId, onlyCountAllocated); + } @Override public void releasePrivateIpAddress(String ipAddress, long dcId, Long instanceId) { diff --git a/server/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java b/server/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java index efd1248b5f8..c935db9174b 100755 --- a/server/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java +++ b/server/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java @@ -23,12 +23,17 @@ import java.util.Date; import java.util.List; import com.cloud.dc.DataCenterVnetVO; +import com.cloud.dc.Vlan.VlanType; +import com.cloud.network.IpAddress.State; import com.cloud.utils.db.DB; import com.cloud.utils.db.GenericDao; 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; /** @@ -41,6 +46,8 @@ public class DataCenterVnetDaoImpl extends GenericDaoBase VnetDcSearch; private final SearchBuilder VnetDcSearchAllocated; private final SearchBuilder DcSearchAllocated; + private final GenericSearchBuilder countZoneVlans; + private final GenericSearchBuilder countAllocatedZoneVlans; public List listAllocatedVnets(long dcId) { SearchCriteria sc = DcSearchAllocated.create(); @@ -55,6 +62,13 @@ public class DataCenterVnetDaoImpl extends GenericDaoBase sc = onlyCountAllocated ? countAllocatedZoneVlans.create() : countZoneVlans.create(); + sc.setParameters("dc", dcId); + return customSearch(sc, null).get(0); + } + + @DB public void add(long dcId, int start, int end) { String insertVnet = "INSERT INTO `cloud`.`op_dc_vnet_alloc` (vnet, data_center_id) VALUES ( ?, ?)"; @@ -136,6 +150,17 @@ public class DataCenterVnetDaoImpl extends GenericDaoBase summedCapacities = _capacityDao.findCapacityBy(capacityType, zoneId, podId, clusterId); List capacities = new ArrayList();