Skip to content

Commit 10ea88a

Browse files
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.
1 parent eeb293d commit 10ea88a

8 files changed

Lines changed: 102 additions & 25 deletions

File tree

api/src/com/cloud/api/ApiConstants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ public class ApiConstants {
6363
public static final String END_IP = "endip";
6464
public static final String END_PORT = "endport";
6565
public static final String ENTRY_TIME = "entrytime";
66+
public static final String FETCH_LATEST = "fetchlatest";
6667
public static final String FIRSTNAME = "firstname";
6768
public static final String FORCED = "forced";
6869
public static final String FORCED_DESTROY_LOCAL_STORAGE = "forcedestroylocalstorage";

api/src/com/cloud/api/commands/ListCapacityCmd.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ public class ListCapacityCmd extends BaseListCmd {
5353
@Parameter(name=ApiConstants.CLUSTER_ID, type=CommandType.LONG, description="lists capacity by the Cluster ID")
5454
private Long clusterId;
5555

56+
@Parameter(name=ApiConstants.FETCH_LATEST, type=CommandType.BOOLEAN, description="recalculate capacities")
57+
private Boolean fetchLatest;
58+
5659
@Parameter(name=ApiConstants.TYPE, type=CommandType.INTEGER, description="lists capacity by type" +
5760
"* CAPACITY_TYPE_MEMORY = 0" +
5861
"* CAPACITY_TYPE_CPU = 1" +
@@ -80,6 +83,10 @@ public Long getClusterId() {
8083
return clusterId;
8184
}
8285

86+
public Boolean getFetchLatest() {
87+
return fetchLatest;
88+
}
89+
8390
public Integer getType() {
8491
return type;
8592
}

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

100644100755
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ public interface Capacity {
2929
public static final short CAPACITY_TYPE_PUBLIC_IP = 4;
3030
public static final short CAPACITY_TYPE_PRIVATE_IP = 5;
3131
public static final short CAPACITY_TYPE_SECONDARY_STORAGE = 6;
32+
public static final short CAPACITY_TYPE_VLAN = 7;
33+
3234

3335
public long getId();
3436

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

Lines changed: 46 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
import com.cloud.dc.dao.ClusterDao;
5757
import com.cloud.dc.dao.DataCenterDao;
5858
import com.cloud.dc.dao.DataCenterIpAddressDao;
59+
import com.cloud.dc.dao.DataCenterVnetDaoImpl;
5960
import com.cloud.dc.dao.HostPodDao;
6061
import com.cloud.host.Host;
6162
import com.cloud.host.HostVO;
@@ -83,7 +84,7 @@
8384
public class AlertManagerImpl implements AlertManager {
8485
private static final Logger s_logger = Logger.getLogger(AlertManagerImpl.class.getName());
8586

86-
private static final long INITIAL_CAPACITY_CHECK_DELAY = 30L * 1000L; // five minutes expressed in milliseconds
87+
private static final long INITIAL_CAPACITY_CHECK_DELAY = 30L * 1000L; // thirty seconds expressed in milliseconds
8788

8889
private static final DecimalFormat _dfPct = new DecimalFormat("###.##");
8990
private static final DecimalFormat _dfWhole = new DecimalFormat("########");
@@ -269,12 +270,10 @@ public void recalculateCapacity() {
269270
Pair<Long, Long> sizes = _volumeDao.getCountAndTotalByPool(pool.getId());
270271
disk = sizes.second();
271272
_storageMgr.createCapacityEntry(pool, disk);
272-
}
273+
}
273274

274-
Transaction txn = Transaction.currentTxn();
275-
try {
276-
txn.start();
277-
// Calculate new Public IP capacity
275+
try {
276+
278277
List<DataCenterVO> datacenters = _dcDao.listAll();
279278
for (DataCenterVO datacenter : datacenters) {
280279
long dcId = datacenter.getId();
@@ -283,16 +282,22 @@ public void recalculateCapacity() {
283282
//What happens if we have multiple vlans? Dashboard currently shows stats
284283
//with no filter based on a vlan
285284
//ideal way would be to remove out the vlan param, and filter only on dcId
286-
//implementing the same
287-
285+
//implementing the same
286+
287+
// Calculate new Public IP capacity
288288
s_logger.trace("Executing public ip capacity update");
289289
createOrUpdateIpCapacity(dcId, null, CapacityVO.CAPACITY_TYPE_PUBLIC_IP);
290290
s_logger.trace("Done with public ip capacity update");
291-
291+
292+
//Calculate VLAN's capacity
293+
s_logger.trace("Executing VLAN capacity update");
294+
createOrUpdateVlanCapacity(dcId);
295+
s_logger.trace("Executing VLAN capacity update");
292296
}
293-
txn.commit();
297+
298+
299+
294300

295-
txn.start();
296301
// Calculate new Private IP capacity
297302
List<HostPodVO> pods = _podDao.listAll();
298303
for (HostPodVO pod : pods) {
@@ -304,16 +309,40 @@ public void recalculateCapacity() {
304309
s_logger.trace("Done with private ip capacity update");
305310

306311
}
307-
txn.commit();
308-
} catch (Exception ex) {
309-
txn.rollback();
312+
313+
} catch (Exception ex) {
310314
s_logger.error("Unable to start transaction for capacity update");
311-
}finally {
312-
txn.close();
313315
}
314316
}
315317

316-
public void createOrUpdateIpCapacity(Long dcId, Long podId, short capacityType){
318+
private void createOrUpdateVlanCapacity(long dcId) {
319+
320+
SearchCriteria<CapacityVO> capacitySC = _capacityDao.createSearchCriteria();
321+
322+
List<CapacityVO> capacities = _capacityDao.search(capacitySC, null);
323+
capacitySC = _capacityDao.createSearchCriteria();
324+
capacitySC.addAnd("dataCenterId", SearchCriteria.Op.EQ, dcId);
325+
capacitySC.addAnd("capacityType", SearchCriteria.Op.EQ, Capacity.CAPACITY_TYPE_VLAN);
326+
capacities = _capacityDao.search(capacitySC, null);
327+
328+
int totalVlans = _dcDao.countZoneVlans(dcId, false);
329+
int allocatedVlans = _dcDao.countZoneVlans(dcId, true);
330+
331+
if (capacities.size() == 0){
332+
CapacityVO newPublicIPCapacity = new CapacityVO(null, dcId, null, null, allocatedVlans, totalVlans, Capacity.CAPACITY_TYPE_VLAN);
333+
_capacityDao.persist(newPublicIPCapacity);
334+
}else if ( !(capacities.get(0).getUsedCapacity() == allocatedVlans
335+
&& capacities.get(0).getTotalCapacity() == totalVlans) ){
336+
CapacityVO capacity = capacities.get(0);
337+
capacity.setUsedCapacity(allocatedVlans);
338+
capacity.setTotalCapacity(totalVlans);
339+
_capacityDao.update(capacity.getId(), capacity);
340+
}
341+
342+
343+
}
344+
345+
public void createOrUpdateIpCapacity(Long dcId, Long podId, short capacityType){
317346
SearchCriteria<CapacityVO> capacitySC = _capacityDao.createSearchCriteria();
318347

319348
List<CapacityVO> capacities = _capacityDao.search(capacitySC, null);

server/src/com/cloud/dc/dao/DataCenterDao.java

100644100755
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,4 +75,6 @@ public interface DataCenterDao extends GenericDao<DataCenterVO, Long> {
7575
List<DataCenterVO> listEnabledZones();
7676
DataCenterVO findByToken(String zoneToken);
7777
DataCenterVO findByTokenOrIdOrName(String tokenIdOrName);
78+
79+
int countZoneVlans(long dcId, boolean onlyCountAllocated);
7880
}

server/src/com/cloud/dc/dao/DataCenterDaoImpl.java

100644100755
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,11 @@ public void releaseVnet(String vnet, long dcId, long accountId, String reservati
127127
public List<DataCenterVnetVO> findVnet(long dcId, String vnet) {
128128
return _vnetAllocDao.findVnet(dcId, vnet);
129129
}
130+
131+
@Override
132+
public int countZoneVlans(long dcId, boolean onlyCountAllocated){
133+
return _vnetAllocDao.countZoneVlans(dcId, onlyCountAllocated);
134+
}
130135

131136
@Override
132137
public void releasePrivateIpAddress(String ipAddress, long dcId, Long instanceId) {

server/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,17 @@
2323
import java.util.List;
2424

2525
import com.cloud.dc.DataCenterVnetVO;
26+
import com.cloud.dc.Vlan.VlanType;
27+
import com.cloud.network.IpAddress.State;
2628
import com.cloud.utils.db.DB;
2729
import com.cloud.utils.db.GenericDao;
2830
import com.cloud.utils.db.GenericDaoBase;
31+
import com.cloud.utils.db.GenericSearchBuilder;
2932
import com.cloud.utils.db.SearchBuilder;
3033
import com.cloud.utils.db.SearchCriteria;
3134
import com.cloud.utils.db.Transaction;
35+
import com.cloud.utils.db.SearchCriteria.Func;
36+
import com.cloud.utils.db.SearchCriteria.Op;
3237
import com.cloud.utils.exception.CloudRuntimeException;
3338

3439
/**
@@ -41,6 +46,8 @@ public class DataCenterVnetDaoImpl extends GenericDaoBase<DataCenterVnetVO, Long
4146
private final SearchBuilder<DataCenterVnetVO> VnetDcSearch;
4247
private final SearchBuilder<DataCenterVnetVO> VnetDcSearchAllocated;
4348
private final SearchBuilder<DataCenterVnetVO> DcSearchAllocated;
49+
private final GenericSearchBuilder<DataCenterVnetVO, Integer> countZoneVlans;
50+
private final GenericSearchBuilder<DataCenterVnetVO, Integer> countAllocatedZoneVlans;
4451

4552
public List<DataCenterVnetVO> listAllocatedVnets(long dcId) {
4653
SearchCriteria<DataCenterVnetVO> sc = DcSearchAllocated.create();
@@ -55,6 +62,13 @@ public List<DataCenterVnetVO> findVnet(long dcId, String vnet) {
5562
return listBy(sc);
5663
}
5764

65+
public int countZoneVlans(long dcId, boolean onlyCountAllocated){
66+
SearchCriteria<Integer> sc = onlyCountAllocated ? countAllocatedZoneVlans.create() : countZoneVlans.create();
67+
sc.setParameters("dc", dcId);
68+
return customSearch(sc, null).get(0);
69+
}
70+
71+
5872
@DB
5973
public void add(long dcId, int start, int end) {
6074
String insertVnet = "INSERT INTO `cloud`.`op_dc_vnet_alloc` (vnet, data_center_id) VALUES ( ?, ?)";
@@ -136,6 +150,17 @@ protected DataCenterVnetDaoImpl() {
136150
VnetDcSearch.and("vnet", VnetDcSearch.entity().getVnet(), SearchCriteria.Op.EQ);
137151
VnetDcSearch.and("dc", VnetDcSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ);
138152
VnetDcSearch.done();
153+
154+
countZoneVlans = createSearchBuilder(Integer.class);
155+
countZoneVlans.select(null, Func.COUNT, countZoneVlans.entity().getId());
156+
countZoneVlans.and("dc", countZoneVlans.entity().getDataCenterId(), Op.EQ);
157+
countZoneVlans.done();
158+
159+
countAllocatedZoneVlans = createSearchBuilder(Integer.class);
160+
countAllocatedZoneVlans.select(null, Func.COUNT, countAllocatedZoneVlans.entity().getId());
161+
countAllocatedZoneVlans.and("dc", countAllocatedZoneVlans.entity().getDataCenterId(), Op.EQ);
162+
countAllocatedZoneVlans.and("allocated", countAllocatedZoneVlans.entity().getTakenAt(), SearchCriteria.Op.NNULL);
163+
countAllocatedZoneVlans.done();
139164

140165
VnetDcSearchAllocated = createSearchBuilder();
141166
VnetDcSearchAllocated.and("vnet", VnetDcSearchAllocated.entity().getVnet(), SearchCriteria.Op.EQ);

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

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import java.util.HashMap;
3131
import java.util.HashSet;
3232
import java.util.Iterator;
33-
import java.util.LinkedList;
3433
import java.util.List;
3534
import java.util.Map;
3635
import java.util.Set;
@@ -54,6 +53,7 @@
5453
import com.cloud.agent.api.storage.CopyVolumeCommand;
5554
import com.cloud.agent.manager.allocator.HostAllocator;
5655
import com.cloud.alert.Alert;
56+
import com.cloud.alert.AlertManager;
5757
import com.cloud.alert.AlertVO;
5858
import com.cloud.alert.dao.AlertDao;
5959
import com.cloud.api.ApiConstants;
@@ -126,8 +126,8 @@
126126
import com.cloud.dc.DataCenterVO;
127127
import com.cloud.dc.HostPodVO;
128128
import com.cloud.dc.PodVlanMapVO;
129-
import com.cloud.dc.Vlan.VlanType;
130129
import com.cloud.dc.VlanVO;
130+
import com.cloud.dc.Vlan.VlanType;
131131
import com.cloud.dc.dao.AccountVlanMapDao;
132132
import com.cloud.dc.dao.ClusterDao;
133133
import com.cloud.dc.dao.DataCenterDao;
@@ -153,13 +153,13 @@
153153
import com.cloud.exception.StorageUnavailableException;
154154
import com.cloud.host.DetailVO;
155155
import com.cloud.host.Host;
156-
import com.cloud.host.Host.Type;
157156
import com.cloud.host.HostVO;
157+
import com.cloud.host.Host.Type;
158158
import com.cloud.host.dao.HostDao;
159159
import com.cloud.host.dao.HostDetailsDao;
160-
import com.cloud.hypervisor.Hypervisor.HypervisorType;
161160
import com.cloud.hypervisor.HypervisorCapabilities;
162161
import com.cloud.hypervisor.HypervisorCapabilitiesVO;
162+
import com.cloud.hypervisor.Hypervisor.HypervisorType;
163163
import com.cloud.hypervisor.dao.HypervisorCapabilitiesDao;
164164
import com.cloud.info.ConsoleProxyInfo;
165165
import com.cloud.keystore.KeystoreManager;
@@ -178,15 +178,15 @@
178178
import com.cloud.storage.GuestOSVO;
179179
import com.cloud.storage.LaunchPermissionVO;
180180
import com.cloud.storage.Storage;
181-
import com.cloud.storage.Storage.ImageFormat;
182181
import com.cloud.storage.StorageManager;
183182
import com.cloud.storage.StoragePoolVO;
184183
import com.cloud.storage.Upload;
185-
import com.cloud.storage.Upload.Mode;
186184
import com.cloud.storage.UploadVO;
187185
import com.cloud.storage.VMTemplateVO;
188186
import com.cloud.storage.Volume;
189187
import com.cloud.storage.VolumeVO;
188+
import com.cloud.storage.Storage.ImageFormat;
189+
import com.cloud.storage.Upload.Mode;
190190
import com.cloud.storage.dao.DiskOfferingDao;
191191
import com.cloud.storage.dao.GuestOSCategoryDao;
192192
import com.cloud.storage.dao.GuestOSDao;
@@ -224,10 +224,10 @@
224224
import com.cloud.utils.db.Filter;
225225
import com.cloud.utils.db.GlobalLock;
226226
import com.cloud.utils.db.JoinBuilder;
227-
import com.cloud.utils.db.JoinBuilder.JoinType;
228227
import com.cloud.utils.db.SearchBuilder;
229228
import com.cloud.utils.db.SearchCriteria;
230229
import com.cloud.utils.db.Transaction;
230+
import com.cloud.utils.db.JoinBuilder.JoinType;
231231
import com.cloud.utils.exception.CloudRuntimeException;
232232
import com.cloud.utils.net.MacAddress;
233233
import com.cloud.utils.net.NetUtils;
@@ -241,10 +241,10 @@
241241
import com.cloud.vm.UserVmVO;
242242
import com.cloud.vm.VMInstanceVO;
243243
import com.cloud.vm.VirtualMachine;
244-
import com.cloud.vm.VirtualMachine.State;
245244
import com.cloud.vm.VirtualMachineManager;
246245
import com.cloud.vm.VirtualMachineProfile;
247246
import com.cloud.vm.VirtualMachineProfileImpl;
247+
import com.cloud.vm.VirtualMachine.State;
248248
import com.cloud.vm.dao.ConsoleProxyDao;
249249
import com.cloud.vm.dao.DomainRouterDao;
250250
import com.cloud.vm.dao.InstanceGroupDao;
@@ -260,6 +260,7 @@ public class ManagementServerImpl implements ManagementServer {
260260

261261
private final AccountManager _accountMgr;
262262
private final AgentManager _agentMgr;
263+
private final AlertManager _alertMgr;
263264
private final IPAddressDao _publicIpAddressDao;
264265
private final DomainRouterDao _routerDao;
265266
private final ConsoleProxyDao _consoleProxyDao;
@@ -342,6 +343,7 @@ protected ManagementServerImpl() {
342343

343344
_accountMgr = locator.getManager(AccountManager.class);
344345
_agentMgr = locator.getManager(AgentManager.class);
346+
_alertMgr = locator.getManager(AlertManager.class);
345347
_vmMgr = locator.getManager(UserVmManager.class);
346348
_consoleProxyMgr = locator.getManager(ConsoleProxyManager.class);
347349
_secStorageVmMgr = locator.getManager(SecondaryStorageVmManager.class);
@@ -2468,8 +2470,12 @@ public List<CapacityVO> listCapacities(ListCapacityCmd cmd) {
24682470
Long zoneId = cmd.getZoneId();
24692471
Long podId = cmd.getPodId();
24702472
Long clusterId = cmd.getClusterId();
2473+
Boolean fetchLatest = cmd.getFetchLatest();
24712474

24722475
zoneId = _accountMgr.checkAccessAndSpecifyAuthority(UserContext.current().getCaller(), zoneId);
2476+
if (fetchLatest != null && fetchLatest){
2477+
_alertMgr.recalculateCapacity();
2478+
}
24732479
List<SummedCapacity> summedCapacities = _capacityDao.findCapacityBy(capacityType, zoneId, podId, clusterId);
24742480
List<CapacityVO> capacities = new ArrayList<CapacityVO>();
24752481

0 commit comments

Comments
 (0)