Skip to content

Commit 4b21650

Browse files
bug 10848: Removing NPE from listCapacity and new alert code. Adding CAPACITY_TYPE_DIRECT_ATTACHED_PUBLIC_IP. Introducing thresholds for vlan and direct attached public ips.
1 parent 3921421 commit 4b21650

7 files changed

Lines changed: 63 additions & 24 deletions

File tree

api/src/com/cloud/capacity/Capacity.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@ public interface Capacity {
2626
public static final short CAPACITY_TYPE_CPU = 1;
2727
public static final short CAPACITY_TYPE_STORAGE = 2;
2828
public static final short CAPACITY_TYPE_STORAGE_ALLOCATED = 3;
29-
public static final short CAPACITY_TYPE_PUBLIC_IP = 4;
29+
public static final short CAPACITY_TYPE_VIRTUAL_NETWORK_PUBLIC_IP = 4;
3030
public static final short CAPACITY_TYPE_PRIVATE_IP = 5;
3131
public static final short CAPACITY_TYPE_SECONDARY_STORAGE = 6;
3232
public static final short CAPACITY_TYPE_VLAN = 7;
33-
33+
public static final short CAPACITY_TYPE_DIRECT_ATTACHED_PUBLIC_IP = 8;
3434

3535
public long getId();
3636

core/src/com/cloud/alert/AlertManager.java

100644100755
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,9 @@ public interface AlertManager extends Manager {
2626
public static final short ALERT_TYPE_CPU = CapacityVO.CAPACITY_TYPE_CPU;
2727
public static final short ALERT_TYPE_STORAGE = CapacityVO.CAPACITY_TYPE_STORAGE;
2828
public static final short ALERT_TYPE_STORAGE_ALLOCATED = CapacityVO.CAPACITY_TYPE_STORAGE_ALLOCATED;
29-
public static final short ALERT_TYPE_PUBLIC_IP = CapacityVO.CAPACITY_TYPE_PUBLIC_IP;
29+
public static final short ALERT_TYPE_VIRTUAL_NETWORK_PUBLIC_IP = CapacityVO.CAPACITY_TYPE_VIRTUAL_NETWORK_PUBLIC_IP;
3030
public static final short ALERT_TYPE_PRIVATE_IP = CapacityVO.CAPACITY_TYPE_PRIVATE_IP;
31+
public static final short ALERT_TYPE_SECONDARY_STORAGE = CapacityVO.CAPACITY_TYPE_SECONDARY_STORAGE;
3132
public static final short ALERT_TYPE_HOST = 6;
3233
public static final short ALERT_TYPE_USERVM = 7;
3334
public static final short ALERT_TYPE_DOMAIN_ROUTER = 8;

server/src/com/cloud/alert/AlertManagerImpl.java

Lines changed: 51 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,11 @@
3131

3232
import javax.ejb.Local;
3333
import javax.mail.Authenticator;
34-
import javax.mail.Message.RecipientType;
3534
import javax.mail.MessagingException;
3635
import javax.mail.PasswordAuthentication;
3736
import javax.mail.Session;
3837
import javax.mail.URLName;
38+
import javax.mail.Message.RecipientType;
3939
import javax.mail.internet.InternetAddress;
4040
import javax.naming.ConfigurationException;
4141

@@ -53,18 +53,15 @@
5353
import com.cloud.dc.ClusterVO;
5454
import com.cloud.dc.DataCenterVO;
5555
import com.cloud.dc.HostPodVO;
56+
import com.cloud.dc.Vlan.VlanType;
5657
import com.cloud.dc.dao.ClusterDao;
5758
import com.cloud.dc.dao.DataCenterDao;
5859
import com.cloud.dc.dao.DataCenterIpAddressDao;
59-
import com.cloud.dc.dao.DataCenterVnetDaoImpl;
6060
import com.cloud.dc.dao.HostPodDao;
6161
import com.cloud.host.Host;
6262
import com.cloud.host.HostVO;
63-
import com.cloud.host.Status;
6463
import com.cloud.host.dao.HostDao;
6564
import com.cloud.network.dao.IPAddressDao;
66-
import com.cloud.service.ServiceOfferingVO;
67-
import com.cloud.service.dao.ServiceOfferingDao;
6865
import com.cloud.storage.StorageManager;
6966
import com.cloud.storage.StoragePoolVO;
7067
import com.cloud.storage.dao.StoragePoolDao;
@@ -75,7 +72,6 @@
7572
import com.cloud.utils.component.Inject;
7673
import com.cloud.utils.db.DB;
7774
import com.cloud.utils.db.SearchCriteria;
78-
import com.cloud.utils.db.Transaction;
7975
import com.sun.mail.smtp.SMTPMessage;
8076
import com.sun.mail.smtp.SMTPSSLTransport;
8177
import com.sun.mail.smtp.SMTPTransport;
@@ -114,6 +110,8 @@ public class AlertManagerImpl implements AlertManager {
114110
private double _publicIPCapacityThreshold = 0.75;
115111
private double _privateIPCapacityThreshold = 0.75;
116112
private double _secondaryStorageCapacityThreshold = 0.75;
113+
private double _vlanCapacityThreshold = 0.75;
114+
private double _directNetworkPublicIpCapacityThreshold = 0.75;
117115
Map<Short,Double> _capacityTypeThresholdMap = new HashMap<Short, Double>();
118116

119117
@Override
@@ -157,7 +155,9 @@ public boolean configure(String name, Map<String, Object> params) throws Configu
157155
String storageAllocCapacityThreshold = configs.get("storage.allocated.capacity.threshold");
158156
String publicIPCapacityThreshold = configs.get("public.ip.capacity.threshold");
159157
String privateIPCapacityThreshold = configs.get("private.ip.capacity.threshold");
160-
String secondaryStorageCapacityThreshold = configs.get("secondarystorage.capacity.threshold");
158+
String secondaryStorageCapacityThreshold = configs.get("secondarystorage.capacity.threshold");
159+
String vlanCapacityThreshold = configs.get("vlan.capacity.threshold");
160+
String directNetworkPublicIpCapacityThreshold = configs.get("directnetwork.public.ip.capacity.threshold");
161161

162162
if (storageCapacityThreshold != null) {
163163
_storageCapacityThreshold = Double.parseDouble(storageCapacityThreshold);
@@ -180,14 +180,22 @@ public boolean configure(String name, Map<String, Object> params) throws Configu
180180
if (secondaryStorageCapacityThreshold != null) {
181181
_secondaryStorageCapacityThreshold = Double.parseDouble(secondaryStorageCapacityThreshold);
182182
}
183+
if (vlanCapacityThreshold != null) {
184+
_vlanCapacityThreshold = Double.parseDouble(vlanCapacityThreshold);
185+
}
186+
if (directNetworkPublicIpCapacityThreshold != null) {
187+
_directNetworkPublicIpCapacityThreshold = Double.parseDouble(directNetworkPublicIpCapacityThreshold);
188+
}
183189

184190
_capacityTypeThresholdMap.put(Capacity.CAPACITY_TYPE_STORAGE, _storageCapacityThreshold);
185191
_capacityTypeThresholdMap.put(Capacity.CAPACITY_TYPE_STORAGE_ALLOCATED, _storageAllocCapacityThreshold);
186192
_capacityTypeThresholdMap.put(Capacity.CAPACITY_TYPE_CPU, _cpuCapacityThreshold);
187193
_capacityTypeThresholdMap.put(Capacity.CAPACITY_TYPE_MEMORY, _memoryCapacityThreshold);
188-
_capacityTypeThresholdMap.put(Capacity.CAPACITY_TYPE_PUBLIC_IP, _publicIPCapacityThreshold);
194+
_capacityTypeThresholdMap.put(Capacity.CAPACITY_TYPE_VIRTUAL_NETWORK_PUBLIC_IP, _publicIPCapacityThreshold);
189195
_capacityTypeThresholdMap.put(Capacity.CAPACITY_TYPE_PRIVATE_IP, _privateIPCapacityThreshold);
190196
_capacityTypeThresholdMap.put(Capacity.CAPACITY_TYPE_SECONDARY_STORAGE, _secondaryStorageCapacityThreshold);
197+
_capacityTypeThresholdMap.put(Capacity.CAPACITY_TYPE_VLAN, _vlanCapacityThreshold);
198+
_capacityTypeThresholdMap.put(Capacity.CAPACITY_TYPE_DIRECT_ATTACHED_PUBLIC_IP, _directNetworkPublicIpCapacityThreshold);
191199

192200
String capacityCheckPeriodStr = configs.get("capacity.check.period");
193201
if (capacityCheckPeriodStr != null) {
@@ -291,10 +299,15 @@ public void recalculateCapacity() {
291299
//ideal way would be to remove out the vlan param, and filter only on dcId
292300
//implementing the same
293301

294-
// Calculate new Public IP capacity
295-
s_logger.trace("Executing public ip capacity update");
296-
createOrUpdateIpCapacity(dcId, null, CapacityVO.CAPACITY_TYPE_PUBLIC_IP);
297-
s_logger.trace("Done with public ip capacity update");
302+
// Calculate new Public IP capacity for Virtual Network
303+
s_logger.trace("Executing public ip capacity update for Virtual Network");
304+
createOrUpdateIpCapacity(dcId, null, CapacityVO.CAPACITY_TYPE_VIRTUAL_NETWORK_PUBLIC_IP);
305+
s_logger.trace("Done with public ip capacity update for Virtual Network");
306+
307+
// Calculate new Public IP capacity for Direct Attached Network
308+
s_logger.trace("Executing public ip capacity update for Direct Attached Network");
309+
createOrUpdateIpCapacity(dcId, null, CapacityVO.CAPACITY_TYPE_DIRECT_ATTACHED_PUBLIC_IP);
310+
s_logger.trace("Done with public ip capacity update for Direct Attached Network");
298311

299312
//Calculate VLAN's capacity
300313
s_logger.trace("Executing VLAN capacity update");
@@ -364,9 +377,12 @@ public void createOrUpdateIpCapacity(Long dcId, Long podId, short capacityType){
364377
if (capacityType == CapacityVO.CAPACITY_TYPE_PRIVATE_IP){
365378
totalIPs = _privateIPAddressDao.countIPs(podId, dcId, false);
366379
allocatedIPs = _privateIPAddressDao.countIPs(podId, dcId, true);
367-
}else{
368-
totalIPs = _publicIPAddressDao.countIPsForDashboard(dcId, false);
369-
allocatedIPs = _publicIPAddressDao.countIPsForDashboard(dcId, true);
380+
}else if (capacityType == CapacityVO.CAPACITY_TYPE_VIRTUAL_NETWORK_PUBLIC_IP){
381+
totalIPs = _publicIPAddressDao.countIPsForNetwork(dcId, false, VlanType.VirtualNetwork);
382+
allocatedIPs = _publicIPAddressDao.countIPsForNetwork(dcId, true, VlanType.VirtualNetwork);
383+
}else {
384+
totalIPs = _publicIPAddressDao.countIPsForNetwork(dcId, false, VlanType.DirectAttached);
385+
allocatedIPs = _publicIPAddressDao.countIPsForNetwork(dcId, true, VlanType.DirectAttached);
370386
}
371387

372388
if (capacities.size() == 0){
@@ -416,6 +432,9 @@ public void checkForAlerts(){
416432
for(DataCenterVO dc : dataCenterList){
417433
for (Short capacityType : dataCenterCapacityTypes){
418434
List<SummedCapacity> capacity = _capacityDao.findCapacityBy(capacityType.intValue(), dc.getId(), null, null);
435+
if (capacity == null || capacity.size() == 0){
436+
continue;
437+
}
419438
double totalCapacity = capacity.get(0).getTotalCapacity();
420439
double usedCapacity = capacity.get(0).getUsedCapacity();
421440
if (totalCapacity != 0 && usedCapacity/totalCapacity > _capacityTypeThresholdMap.get(capacityType)){
@@ -428,6 +447,9 @@ public void checkForAlerts(){
428447
for( HostPodVO pod : podList){
429448
for (Short capacityType : podCapacityTypes){
430449
List<SummedCapacity> capacity = _capacityDao.findCapacityBy(capacityType.intValue(), pod.getDataCenterId(), pod.getId(), null);
450+
if (capacity == null || capacity.size() == 0){
451+
continue;
452+
}
431453
double totalCapacity = capacity.get(0).getTotalCapacity();
432454
double usedCapacity = capacity.get(0).getUsedCapacity();
433455
if (totalCapacity != 0 && usedCapacity/totalCapacity > _capacityTypeThresholdMap.get(capacityType)){
@@ -441,6 +463,9 @@ public void checkForAlerts(){
441463
for( ClusterVO cluster : clusterList){
442464
for (Short capacityType : clusterCapacityTypes){
443465
List<SummedCapacity> capacity = _capacityDao.findCapacityBy(capacityType.intValue(), cluster.getDataCenterId(), null, cluster.getId());
466+
if (capacity == null || capacity.size() == 0){
467+
continue;
468+
}
444469
double totalCapacity = capacity.get(0).getTotalCapacity();
445470
double usedCapacity = capacity.get(0).getUsedCapacity();
446471
if (totalCapacity != 0 && usedCapacity/totalCapacity > _capacityTypeThresholdMap.get(capacityType)){
@@ -485,7 +510,7 @@ private void generateEmailAlert(DataCenterVO dc, HostPodVO pod, ClusterVO cluste
485510
usedStr = formatBytesToMegabytes(usedCapacity);
486511
msgContent = "Unallocated storage space is low, total: " + totalStr + " MB, allocated: " + usedStr + " MB (" + pctStr + "%)";
487512
break;
488-
case CapacityVO.CAPACITY_TYPE_PUBLIC_IP:
513+
case CapacityVO.CAPACITY_TYPE_VIRTUAL_NETWORK_PUBLIC_IP:
489514
msgSubject = "System Alert: Number of unallocated public IPs is low in availablity zone " + dc.getName();
490515
totalStr = Double.toString(totalCapacity);
491516
usedStr = Double.toString(usedCapacity);
@@ -497,6 +522,13 @@ private void generateEmailAlert(DataCenterVO dc, HostPodVO pod, ClusterVO cluste
497522
usedStr = Double.toString(usedCapacity);
498523
msgContent = "Number of unallocated private IPs is low, total: " + totalStr + ", allocated: " + usedStr + " (" + pctStr + "%)";
499524
break;
525+
526+
case CapacityVO.CAPACITY_TYPE_SECONDARY_STORAGE:
527+
msgSubject = "System Alert: Low Available Storage in availablity zone " + dc.getName();
528+
totalStr = Double.toString(totalCapacity);
529+
usedStr = Double.toString(usedCapacity);
530+
msgContent = "Available secondary storage space is low, total: " + totalStr + " MB, used: " + usedStr + " MB (" + pctStr + "%)";
531+
break;
500532
}
501533

502534
try {
@@ -509,8 +541,10 @@ private void generateEmailAlert(DataCenterVO dc, HostPodVO pod, ClusterVO cluste
509541
private List<Short> getCapacityTypesAtZoneLevel(){
510542

511543
List<Short> dataCenterCapacityTypes = new ArrayList<Short>();
512-
dataCenterCapacityTypes.add(Capacity.CAPACITY_TYPE_PUBLIC_IP);
544+
dataCenterCapacityTypes.add(Capacity.CAPACITY_TYPE_VIRTUAL_NETWORK_PUBLIC_IP);
545+
dataCenterCapacityTypes.add(Capacity.CAPACITY_TYPE_DIRECT_ATTACHED_PUBLIC_IP);
513546
dataCenterCapacityTypes.add(Capacity.CAPACITY_TYPE_SECONDARY_STORAGE);
547+
dataCenterCapacityTypes.add(Capacity.CAPACITY_TYPE_VLAN);
514548
return dataCenterCapacityTypes;
515549

516550
}

server/src/com/cloud/configuration/Config.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ public enum Config {
101101
PublicIpCapacityThreshold("Usage", ManagementServer.class, Float.class, "public.ip.capacity.threshold", "0.85", "Percentage (as a value between 0 and 1) of public IP address space utilization above which alerts will be sent.", null),
102102
PrivateIpCapacityThreshold("Usage", ManagementServer.class, Float.class, "private.ip.capacity.threshold", "0.85", "Percentage (as a value between 0 and 1) of private IP address space utilization above which alerts will be sent.", null),
103103
SecondaryStorageCapacityThreshold("Usage", ManagementServer.class, Float.class, "secondarystorage.capacity.threshold", "0.85", "Percentage (as a value between 0 and 1) of secondary storage utilization above which alerts will be sent about low storage available.", null),
104+
VlanCapacityThreshold("Usage", ManagementServer.class, Float.class, "vlan.capacity.threshold", "0.85", "Percentage (as a value between 0 and 1) of Zone Vlan utilization above which alerts will be sent about low number of Zone Vlans.", null),
105+
DirectNetworkPublicIpCapacityThreshold("Usage", ManagementServer.class, Float.class, "directnetwork.public.ip.capacity.threshold", "0.85", "Percentage (as a value between 0 and 1) of Direct Network Public Ip Utilization above which alerts will be sent about low number of direct network public ips.", null),
104106

105107
// Console Proxy
106108
ConsoleProxyCapacityStandby("Console Proxy", AgentManager.class, String.class, "consoleproxy.capacity.standby", "10", "The minimal number of console proxy viewer sessions that system is able to serve immediately(standby capacity)", null),

server/src/com/cloud/network/dao/IPAddressDao.java

100644100755
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import java.util.List;
2222

23+
import com.cloud.dc.Vlan.VlanType;
2324
import com.cloud.network.IPAddressVO;
2425
import com.cloud.utils.db.GenericDao;
2526
import com.cloud.utils.net.Ip;
@@ -48,7 +49,7 @@ public interface IPAddressDao extends GenericDao<IPAddressVO, Long> {
4849

4950
boolean mark(long dcId, Ip ip);
5051

51-
int countIPsForDashboard(long dcId, boolean onlyCountAllocated);
52+
int countIPsForNetwork(long dcId, boolean onlyCountAllocated, VlanType vlanType);
5253

5354
IPAddressVO findByAssociatedVmId(long vmId);
5455

server/src/com/cloud/network/dao/IPAddressDaoImpl.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -245,16 +245,17 @@ public int countIPs(long dcId, long vlanId, boolean onlyCountAllocated) {
245245
}
246246

247247
@Override
248-
public int countIPsForDashboard(long dcId, boolean onlyCountAllocated) {
248+
public int countIPsForNetwork(long dcId, boolean onlyCountAllocated, VlanType vlanType) {
249249
SearchCriteria<Integer> sc = AllIpCountForDashboard.create();
250250
sc.setParameters("dc", dcId);
251251
if (onlyCountAllocated){
252252
sc.setParameters("state", State.Free);
253253
}
254-
sc.setJoinParameters("vlan", "vlanType", VlanType.VirtualNetwork.toString());
254+
sc.setJoinParameters("vlan", "vlanType", vlanType.toString());
255255
return customSearch(sc, null).get(0);
256256
}
257257

258+
258259
@Override
259260
@DB
260261
public int countIPs(long dcId, Long accountId, String vlanId, String vlanGateway, String vlanNetmask) {

server/src/com/cloud/server/ManagementServerImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2484,7 +2484,7 @@ public List<CapacityVO> listCapacities(ListCapacityCmd cmd) {
24842484
summedCapacity.getUsedCapacity() + summedCapacity.getReservedCapacity(),
24852485
summedCapacity.getTotalCapacity(), summedCapacity.getCapacityType());
24862486

2487-
if (capacityType == Capacity.CAPACITY_TYPE_CPU){
2487+
if ( summedCapacity.getCapacityType() == Capacity.CAPACITY_TYPE_CPU){
24882488
capacity.setTotalCapacity((long)(summedCapacity.getTotalCapacity() * ApiDBUtils.getCpuOverprovisioningFactor()));
24892489
}
24902490
capacities.add(capacity);

0 commit comments

Comments
 (0)