mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
bug 10945: Introduce a new capacity called Zone Vlan. Add a flag called 'fetchlatest' in listcapacity which would recompute the capacity and fetch the latest.
This commit is contained in:
parent
eeb293d48e
commit
10ea88ad08
@ -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";
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
2
api/src/com/cloud/capacity/Capacity.java
Normal file → Executable file
2
api/src/com/cloud/capacity/Capacity.java
Normal file → Executable file
@ -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();
|
||||
|
||||
|
||||
@ -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<Long, Long> 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<DataCenterVO> 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<HostPodVO> 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<CapacityVO> capacitySC = _capacityDao.createSearchCriteria();
|
||||
|
||||
List<CapacityVO> 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<CapacityVO> capacitySC = _capacityDao.createSearchCriteria();
|
||||
|
||||
List<CapacityVO> capacities = _capacityDao.search(capacitySC, null);
|
||||
|
||||
2
server/src/com/cloud/dc/dao/DataCenterDao.java
Normal file → Executable file
2
server/src/com/cloud/dc/dao/DataCenterDao.java
Normal file → Executable file
@ -75,4 +75,6 @@ public interface DataCenterDao extends GenericDao<DataCenterVO, Long> {
|
||||
List<DataCenterVO> listEnabledZones();
|
||||
DataCenterVO findByToken(String zoneToken);
|
||||
DataCenterVO findByTokenOrIdOrName(String tokenIdOrName);
|
||||
|
||||
int countZoneVlans(long dcId, boolean onlyCountAllocated);
|
||||
}
|
||||
|
||||
5
server/src/com/cloud/dc/dao/DataCenterDaoImpl.java
Normal file → Executable file
5
server/src/com/cloud/dc/dao/DataCenterDaoImpl.java
Normal file → Executable file
@ -127,6 +127,11 @@ public class DataCenterDaoImpl extends GenericDaoBase<DataCenterVO, Long> implem
|
||||
public List<DataCenterVnetVO> 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) {
|
||||
|
||||
@ -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<DataCenterVnetVO, Long
|
||||
private final SearchBuilder<DataCenterVnetVO> VnetDcSearch;
|
||||
private final SearchBuilder<DataCenterVnetVO> VnetDcSearchAllocated;
|
||||
private final SearchBuilder<DataCenterVnetVO> DcSearchAllocated;
|
||||
private final GenericSearchBuilder<DataCenterVnetVO, Integer> countZoneVlans;
|
||||
private final GenericSearchBuilder<DataCenterVnetVO, Integer> countAllocatedZoneVlans;
|
||||
|
||||
public List<DataCenterVnetVO> listAllocatedVnets(long dcId) {
|
||||
SearchCriteria<DataCenterVnetVO> sc = DcSearchAllocated.create();
|
||||
@ -55,6 +62,13 @@ public class DataCenterVnetDaoImpl extends GenericDaoBase<DataCenterVnetVO, Long
|
||||
return listBy(sc);
|
||||
}
|
||||
|
||||
public int countZoneVlans(long dcId, boolean onlyCountAllocated){
|
||||
SearchCriteria<Integer> 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<DataCenterVnetVO, Long
|
||||
VnetDcSearch.and("vnet", VnetDcSearch.entity().getVnet(), SearchCriteria.Op.EQ);
|
||||
VnetDcSearch.and("dc", VnetDcSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ);
|
||||
VnetDcSearch.done();
|
||||
|
||||
countZoneVlans = createSearchBuilder(Integer.class);
|
||||
countZoneVlans.select(null, Func.COUNT, countZoneVlans.entity().getId());
|
||||
countZoneVlans.and("dc", countZoneVlans.entity().getDataCenterId(), Op.EQ);
|
||||
countZoneVlans.done();
|
||||
|
||||
countAllocatedZoneVlans = createSearchBuilder(Integer.class);
|
||||
countAllocatedZoneVlans.select(null, Func.COUNT, countAllocatedZoneVlans.entity().getId());
|
||||
countAllocatedZoneVlans.and("dc", countAllocatedZoneVlans.entity().getDataCenterId(), Op.EQ);
|
||||
countAllocatedZoneVlans.and("allocated", countAllocatedZoneVlans.entity().getTakenAt(), SearchCriteria.Op.NNULL);
|
||||
countAllocatedZoneVlans.done();
|
||||
|
||||
VnetDcSearchAllocated = createSearchBuilder();
|
||||
VnetDcSearchAllocated.and("vnet", VnetDcSearchAllocated.entity().getVnet(), SearchCriteria.Op.EQ);
|
||||
|
||||
@ -30,7 +30,6 @@ import java.util.Enumeration;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
@ -54,6 +53,7 @@ import com.cloud.agent.api.storage.CopyVolumeAnswer;
|
||||
import com.cloud.agent.api.storage.CopyVolumeCommand;
|
||||
import com.cloud.agent.manager.allocator.HostAllocator;
|
||||
import com.cloud.alert.Alert;
|
||||
import com.cloud.alert.AlertManager;
|
||||
import com.cloud.alert.AlertVO;
|
||||
import com.cloud.alert.dao.AlertDao;
|
||||
import com.cloud.api.ApiConstants;
|
||||
@ -126,8 +126,8 @@ import com.cloud.dc.ClusterVO;
|
||||
import com.cloud.dc.DataCenterVO;
|
||||
import com.cloud.dc.HostPodVO;
|
||||
import com.cloud.dc.PodVlanMapVO;
|
||||
import com.cloud.dc.Vlan.VlanType;
|
||||
import com.cloud.dc.VlanVO;
|
||||
import com.cloud.dc.Vlan.VlanType;
|
||||
import com.cloud.dc.dao.AccountVlanMapDao;
|
||||
import com.cloud.dc.dao.ClusterDao;
|
||||
import com.cloud.dc.dao.DataCenterDao;
|
||||
@ -153,13 +153,13 @@ import com.cloud.exception.ResourceUnavailableException;
|
||||
import com.cloud.exception.StorageUnavailableException;
|
||||
import com.cloud.host.DetailVO;
|
||||
import com.cloud.host.Host;
|
||||
import com.cloud.host.Host.Type;
|
||||
import com.cloud.host.HostVO;
|
||||
import com.cloud.host.Host.Type;
|
||||
import com.cloud.host.dao.HostDao;
|
||||
import com.cloud.host.dao.HostDetailsDao;
|
||||
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||
import com.cloud.hypervisor.HypervisorCapabilities;
|
||||
import com.cloud.hypervisor.HypervisorCapabilitiesVO;
|
||||
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||
import com.cloud.hypervisor.dao.HypervisorCapabilitiesDao;
|
||||
import com.cloud.info.ConsoleProxyInfo;
|
||||
import com.cloud.keystore.KeystoreManager;
|
||||
@ -178,15 +178,15 @@ import com.cloud.storage.GuestOSCategoryVO;
|
||||
import com.cloud.storage.GuestOSVO;
|
||||
import com.cloud.storage.LaunchPermissionVO;
|
||||
import com.cloud.storage.Storage;
|
||||
import com.cloud.storage.Storage.ImageFormat;
|
||||
import com.cloud.storage.StorageManager;
|
||||
import com.cloud.storage.StoragePoolVO;
|
||||
import com.cloud.storage.Upload;
|
||||
import com.cloud.storage.Upload.Mode;
|
||||
import com.cloud.storage.UploadVO;
|
||||
import com.cloud.storage.VMTemplateVO;
|
||||
import com.cloud.storage.Volume;
|
||||
import com.cloud.storage.VolumeVO;
|
||||
import com.cloud.storage.Storage.ImageFormat;
|
||||
import com.cloud.storage.Upload.Mode;
|
||||
import com.cloud.storage.dao.DiskOfferingDao;
|
||||
import com.cloud.storage.dao.GuestOSCategoryDao;
|
||||
import com.cloud.storage.dao.GuestOSDao;
|
||||
@ -224,10 +224,10 @@ import com.cloud.utils.db.DB;
|
||||
import com.cloud.utils.db.Filter;
|
||||
import com.cloud.utils.db.GlobalLock;
|
||||
import com.cloud.utils.db.JoinBuilder;
|
||||
import com.cloud.utils.db.JoinBuilder.JoinType;
|
||||
import com.cloud.utils.db.SearchBuilder;
|
||||
import com.cloud.utils.db.SearchCriteria;
|
||||
import com.cloud.utils.db.Transaction;
|
||||
import com.cloud.utils.db.JoinBuilder.JoinType;
|
||||
import com.cloud.utils.exception.CloudRuntimeException;
|
||||
import com.cloud.utils.net.MacAddress;
|
||||
import com.cloud.utils.net.NetUtils;
|
||||
@ -241,10 +241,10 @@ import com.cloud.vm.UserVmManager;
|
||||
import com.cloud.vm.UserVmVO;
|
||||
import com.cloud.vm.VMInstanceVO;
|
||||
import com.cloud.vm.VirtualMachine;
|
||||
import com.cloud.vm.VirtualMachine.State;
|
||||
import com.cloud.vm.VirtualMachineManager;
|
||||
import com.cloud.vm.VirtualMachineProfile;
|
||||
import com.cloud.vm.VirtualMachineProfileImpl;
|
||||
import com.cloud.vm.VirtualMachine.State;
|
||||
import com.cloud.vm.dao.ConsoleProxyDao;
|
||||
import com.cloud.vm.dao.DomainRouterDao;
|
||||
import com.cloud.vm.dao.InstanceGroupDao;
|
||||
@ -260,6 +260,7 @@ public class ManagementServerImpl implements ManagementServer {
|
||||
|
||||
private final AccountManager _accountMgr;
|
||||
private final AgentManager _agentMgr;
|
||||
private final AlertManager _alertMgr;
|
||||
private final IPAddressDao _publicIpAddressDao;
|
||||
private final DomainRouterDao _routerDao;
|
||||
private final ConsoleProxyDao _consoleProxyDao;
|
||||
@ -342,6 +343,7 @@ public class ManagementServerImpl implements ManagementServer {
|
||||
|
||||
_accountMgr = locator.getManager(AccountManager.class);
|
||||
_agentMgr = locator.getManager(AgentManager.class);
|
||||
_alertMgr = locator.getManager(AlertManager.class);
|
||||
_vmMgr = locator.getManager(UserVmManager.class);
|
||||
_consoleProxyMgr = locator.getManager(ConsoleProxyManager.class);
|
||||
_secStorageVmMgr = locator.getManager(SecondaryStorageVmManager.class);
|
||||
@ -2468,8 +2470,12 @@ public class ManagementServerImpl implements ManagementServer {
|
||||
Long zoneId = cmd.getZoneId();
|
||||
Long podId = cmd.getPodId();
|
||||
Long clusterId = cmd.getClusterId();
|
||||
Boolean fetchLatest = cmd.getFetchLatest();
|
||||
|
||||
zoneId = _accountMgr.checkAccessAndSpecifyAuthority(UserContext.current().getCaller(), zoneId);
|
||||
if (fetchLatest != null && fetchLatest){
|
||||
_alertMgr.recalculateCapacity();
|
||||
}
|
||||
List<SummedCapacity> summedCapacities = _capacityDao.findCapacityBy(capacityType, zoneId, podId, clusterId);
|
||||
List<CapacityVO> capacities = new ArrayList<CapacityVO>();
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user