Skip to content

Commit e04822e

Browse files
committed
bug CS-14530: Whenver adding a new capacity check the state of the resource - if its disabled/enabled.
Reviewed By: Kishan
1 parent b31f383 commit e04822e

6 files changed

Lines changed: 73 additions & 15 deletions

File tree

core/src/com/cloud/capacity/CapacityVO.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public class CapacityVO implements Capacity {
5959
private short capacityType;
6060

6161
@Column(name="capacity_state")
62-
private CapacityState capacityState = CapacityState.Enabled;
62+
private CapacityState capacityState;
6363

6464
@Column(name=GenericDao.CREATED_COLUMN)
6565
protected Date created;
@@ -82,6 +82,7 @@ public CapacityVO(Long hostId, Long dataCenterId, Long podId, Long clusterId, lo
8282
this.totalCapacity = totalCapacity;
8383
this.capacityType = capacityType;
8484
this.updateTime = new Date();
85+
this.capacityState = CapacityState.Enabled;
8586
}
8687

8788
public CapacityVO(Long dataCenterId, Long podId, Long clusterId, short capacityType, float usedPercentage) {
@@ -90,6 +91,7 @@ public CapacityVO(Long dataCenterId, Long podId, Long clusterId, short capacityT
9091
this.clusterId = clusterId;
9192
this.capacityType = capacityType;
9293
this.usedPercentage = usedPercentage;
94+
this.capacityState = CapacityState.Enabled;
9395
}
9496

9597
@Override

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

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,12 @@
3939
import com.cloud.api.ApiDBUtils;
4040
import com.cloud.capacity.Capacity;
4141
import com.cloud.capacity.CapacityManager;
42+
import com.cloud.capacity.CapacityState;
4243
import com.cloud.capacity.CapacityVO;
4344
import com.cloud.capacity.dao.CapacityDao;
4445
import com.cloud.capacity.dao.CapacityDaoImpl.SummedCapacity;
4546
import com.cloud.configuration.Config;
47+
import com.cloud.configuration.ConfigurationManager;
4648
import com.cloud.configuration.dao.ConfigurationDao;
4749
import com.cloud.dc.ClusterVO;
4850
import com.cloud.dc.DataCenter.NetworkType;
@@ -57,6 +59,7 @@
5759
import com.cloud.host.HostVO;
5860
import com.cloud.host.dao.HostDao;
5961
import com.cloud.network.dao.IPAddressDao;
62+
import com.cloud.org.Grouping.AllocationState;
6063
import com.cloud.resource.ResourceManager;
6164
import com.cloud.storage.StorageManager;
6265
import com.cloud.storage.StoragePoolVO;
@@ -97,6 +100,7 @@ public class AlertManagerImpl implements AlertManager {
97100
@Inject private StoragePoolDao _storagePoolDao;
98101
@Inject private ConfigurationDao _configDao;
99102
@Inject private ResourceManager _resourceMgr;
103+
@Inject private ConfigurationManager _configMgr;
100104

101105
private Timer _timer = null;
102106
private float _cpuOverProvisioningFactor = 1;
@@ -319,15 +323,15 @@ public void recalculateCapacity() {
319323

320324
// Calculate new Public IP capacity for Virtual Network
321325
if (datacenter.getNetworkType() == NetworkType.Advanced){
322-
createOrUpdateIpCapacity(dcId, null, CapacityVO.CAPACITY_TYPE_VIRTUAL_NETWORK_PUBLIC_IP);
326+
createOrUpdateIpCapacity(dcId, null, CapacityVO.CAPACITY_TYPE_VIRTUAL_NETWORK_PUBLIC_IP, datacenter.getAllocationState());
323327
}
324328

325329
// Calculate new Public IP capacity for Direct Attached Network
326-
createOrUpdateIpCapacity(dcId, null, CapacityVO.CAPACITY_TYPE_DIRECT_ATTACHED_PUBLIC_IP);
330+
createOrUpdateIpCapacity(dcId, null, CapacityVO.CAPACITY_TYPE_DIRECT_ATTACHED_PUBLIC_IP, datacenter.getAllocationState());
327331

328332
if (datacenter.getNetworkType() == NetworkType.Advanced){
329333
//Calculate VLAN's capacity
330-
createOrUpdateVlanCapacity(dcId);
334+
createOrUpdateVlanCapacity(dcId, datacenter.getAllocationState());
331335
}
332336
}
333337

@@ -342,7 +346,7 @@ public void recalculateCapacity() {
342346
long podId = pod.getId();
343347
long dcId = pod.getDataCenterId();
344348

345-
createOrUpdateIpCapacity(dcId, podId, CapacityVO.CAPACITY_TYPE_PRIVATE_IP);
349+
createOrUpdateIpCapacity(dcId, podId, CapacityVO.CAPACITY_TYPE_PRIVATE_IP, _configMgr.findPodAllocationState(pod));
346350
}
347351

348352
if (s_logger.isDebugEnabled()) {
@@ -355,7 +359,9 @@ public void recalculateCapacity() {
355359
}
356360
}
357361

358-
private void createOrUpdateVlanCapacity(long dcId) {
362+
363+
364+
private void createOrUpdateVlanCapacity(long dcId, AllocationState capacityState) {
359365

360366
SearchCriteria<CapacityVO> capacitySC = _capacityDao.createSearchCriteria();
361367

@@ -369,8 +375,11 @@ private void createOrUpdateVlanCapacity(long dcId) {
369375
int allocatedVlans = _dcDao.countZoneVlans(dcId, true);
370376

371377
if (capacities.size() == 0){
372-
CapacityVO newPublicIPCapacity = new CapacityVO(null, dcId, null, null, allocatedVlans, totalVlans, Capacity.CAPACITY_TYPE_VLAN);
373-
_capacityDao.persist(newPublicIPCapacity);
378+
CapacityVO newVlanCapacity = new CapacityVO(null, dcId, null, null, allocatedVlans, totalVlans, Capacity.CAPACITY_TYPE_VLAN);
379+
if (capacityState == AllocationState.Disabled){
380+
newVlanCapacity.setCapacityState(CapacityState.Disabled);
381+
}
382+
_capacityDao.persist(newVlanCapacity);
374383
}else if ( !(capacities.get(0).getUsedCapacity() == allocatedVlans
375384
&& capacities.get(0).getTotalCapacity() == totalVlans) ){
376385
CapacityVO capacity = capacities.get(0);
@@ -382,7 +391,7 @@ private void createOrUpdateVlanCapacity(long dcId) {
382391

383392
}
384393

385-
public void createOrUpdateIpCapacity(Long dcId, Long podId, short capacityType){
394+
public void createOrUpdateIpCapacity(Long dcId, Long podId, short capacityType, AllocationState capacityState){
386395
SearchCriteria<CapacityVO> capacitySC = _capacityDao.createSearchCriteria();
387396

388397
List<CapacityVO> capacities = _capacityDao.search(capacitySC, null);
@@ -407,6 +416,9 @@ public void createOrUpdateIpCapacity(Long dcId, Long podId, short capacityType){
407416

408417
if (capacities.size() == 0){
409418
CapacityVO newPublicIPCapacity = new CapacityVO(null, dcId, podId, null, allocatedIPs, totalIPs, capacityType);
419+
if (capacityState == AllocationState.Disabled){
420+
newPublicIPCapacity.setCapacityState(CapacityState.Disabled);
421+
}
410422
_capacityDao.persist(newPublicIPCapacity);
411423
}else if ( !(capacities.get(0).getUsedCapacity() == allocatedIPs
412424
&& capacities.get(0).getTotalCapacity() == totalIPs) ){

server/src/com/cloud/capacity/CapacityManagerImpl.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,17 @@
3232
import com.cloud.agent.api.Command;
3333
import com.cloud.agent.api.StartupCommand;
3434
import com.cloud.agent.api.StartupRoutingCommand;
35+
import com.cloud.api.ApiDBUtils;
3536
import com.cloud.capacity.dao.CapacityDao;
3637
import com.cloud.configuration.Config;
38+
import com.cloud.configuration.ConfigurationManager;
3739
import com.cloud.configuration.dao.ConfigurationDao;
3840
import com.cloud.exception.ConnectionException;
3941
import com.cloud.host.HostVO;
4042
import com.cloud.host.Status;
4143
import com.cloud.host.dao.HostDao;
4244
import com.cloud.offering.ServiceOffering;
45+
import com.cloud.org.Grouping.AllocationState;
4346
import com.cloud.resource.ResourceListener;
4447
import com.cloud.resource.ResourceManager;
4548
import com.cloud.resource.ServerResource;
@@ -94,7 +97,9 @@ public class CapacityManagerImpl implements CapacityManager, StateListener<State
9497
@Inject
9598
StorageManager _storageMgr;
9699
@Inject
97-
SwiftManager _swiftMgr;
100+
SwiftManager _swiftMgr;
101+
@Inject
102+
ConfigurationManager _configMgr;
98103

99104
private int _vmCapacityReleaseInterval;
100105
private ScheduledExecutorService _executor;
@@ -479,7 +484,7 @@ public long getAllocatedPoolCapacity(StoragePoolVO pool, VMTemplateVO templateFo
479484
@DB
480485
@Override
481486
public void updateCapacityForHost(HostVO host){
482-
// prep the service offerings
487+
// prepare the service offerings
483488
List<ServiceOfferingVO> offerings = _offeringsDao.listAllIncludingRemoved();
484489
Map<Long, ServiceOfferingVO> offeringsMap = new HashMap<Long, ServiceOfferingVO>();
485490
for (ServiceOfferingVO offering : offerings) {
@@ -557,12 +562,15 @@ public void updateCapacityForHost(HostVO host){
557562
}
558563
}else {
559564
Transaction txn = Transaction.currentTxn();
565+
CapacityState capacityState = _configMgr.findClusterAllocationState(ApiDBUtils.findClusterById(host.getClusterId())) == AllocationState.Disabled ?
566+
CapacityState.Disabled : CapacityState.Enabled;
560567
txn.start();
561568
CapacityVO capacity = new CapacityVO(host.getId(),
562569
host.getDataCenterId(), host.getPodId(), host.getClusterId(), usedMemory,
563570
host.getTotalMemory(),
564571
CapacityVO.CAPACITY_TYPE_MEMORY);
565572
capacity.setReservedCapacity(reservedMemory);
573+
capacity.setCapacityState(capacityState);
566574
_capacityDao.persist(capacity);
567575

568576
capacity = new CapacityVO(
@@ -574,6 +582,7 @@ public void updateCapacityForHost(HostVO host){
574582
(long)(host.getCpus().longValue() * host.getSpeed().longValue()),
575583
CapacityVO.CAPACITY_TYPE_CPU);
576584
capacity.setReservedCapacity(reservedCpu);
585+
capacity.setCapacityState(capacityState);
577586
_capacityDao.persist(capacity);
578587
txn.commit();
579588

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import com.cloud.offering.DiskOffering;
3535
import com.cloud.offering.NetworkOffering.Availability;
3636
import com.cloud.offerings.NetworkOfferingVO;
37+
import com.cloud.org.Grouping.AllocationState;
3738
import com.cloud.service.ServiceOfferingVO;
3839
import com.cloud.storage.DiskOfferingVO;
3940
import com.cloud.user.Account;
@@ -220,4 +221,8 @@ NetworkOfferingVO createNetworkOffering(long userId, String name, String display
220221

221222
void checkPodCidrSubnets(long zoneId, Long podIdToBeSkipped, String cidr);
222223

224+
AllocationState findPodAllocationState(HostPodVO pod);
225+
226+
AllocationState findClusterAllocationState(ClusterVO cluster);
227+
223228
}

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

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838

3939
import com.cloud.acl.SecurityChecker;
4040
import com.cloud.alert.AlertManager;
41+
import com.cloud.api.ApiDBUtils;
4142
import com.cloud.api.ApiConstants.LDAPParams;
4243
import com.cloud.api.commands.CreateDiskOfferingCmd;
4344
import com.cloud.api.commands.CreateNetworkOfferingCmd;
@@ -123,6 +124,7 @@
123124
import com.cloud.offerings.dao.NetworkOfferingDao;
124125
import com.cloud.offerings.dao.NetworkOfferingServiceMapDao;
125126
import com.cloud.org.Grouping;
127+
import com.cloud.org.Grouping.AllocationState;
126128
import com.cloud.projects.Project;
127129
import com.cloud.projects.ProjectManager;
128130
import com.cloud.service.ServiceOfferingVO;
@@ -2706,7 +2708,7 @@ public void checkPodCidrSubnets(long dcId, Long podIdToBeSkipped, String cidr) {
27062708
}
27072709

27082710
}
2709-
2711+
27102712
private boolean validPod(long podId) {
27112713
return (_podDao.findById(podId) != null);
27122714
}
@@ -3642,7 +3644,31 @@ public HostPodVO getPod(long id) {
36423644
public ClusterVO getCluster(long id) {
36433645
return _clusterDao.findById(id);
36443646
}
3647+
3648+
@Override
3649+
public AllocationState findClusterAllocationState(ClusterVO cluster){
3650+
3651+
if(cluster.getAllocationState() == AllocationState.Disabled){
3652+
return AllocationState.Disabled;
3653+
}else if(ApiDBUtils.findPodById(cluster.getPodId()).getAllocationState() == AllocationState.Disabled){
3654+
return AllocationState.Disabled;
3655+
}else {
3656+
DataCenterVO zone = ApiDBUtils.findZoneById(cluster.getDataCenterId());
3657+
return zone.getAllocationState();
3658+
}
3659+
}
36453660

3661+
@Override
3662+
public AllocationState findPodAllocationState(HostPodVO pod){
3663+
3664+
if(pod.getAllocationState() == AllocationState.Disabled){
3665+
return AllocationState.Disabled;
3666+
}else {
3667+
DataCenterVO zone = ApiDBUtils.findZoneById(pod.getDataCenterId());
3668+
return zone.getAllocationState();
3669+
}
3670+
}
3671+
36463672
private boolean allowIpRangeOverlap(VlanVO vlan, boolean forVirtualNetwork, long networkId) {
36473673
// FIXME - delete restriction for virtual network in the future
36483674
if (vlan.getVlanType() == VlanType.DirectAttached && !forVirtualNetwork) {

server/src/com/cloud/storage/StorageManagerImpl.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
import com.cloud.api.commands.UploadVolumeCmd;
7676
import com.cloud.async.AsyncJobManager;
7777
import com.cloud.capacity.Capacity;
78+
import com.cloud.capacity.CapacityState;
7879
import com.cloud.capacity.CapacityVO;
7980
import com.cloud.capacity.dao.CapacityDao;
8081
import com.cloud.cluster.CheckPointManager;
@@ -121,6 +122,7 @@
121122
import com.cloud.network.NetworkManager;
122123
import com.cloud.network.router.VirtualNetworkApplianceManager;
123124
import com.cloud.org.Grouping;
125+
import com.cloud.org.Grouping.AllocationState;
124126
import com.cloud.projects.Project.ListProjectResourcesCriteria;
125127
import com.cloud.resource.ResourceManager;
126128
import com.cloud.resource.ResourceState;
@@ -1997,14 +1999,16 @@ public void createCapacityEntry(StoragePoolVO storagePool, short capacityType, l
19971999

19982000
long totalOverProvCapacity;
19992001
if (storagePool.getPoolType() == StoragePoolType.NetworkFilesystem) {
2000-
totalOverProvCapacity = _overProvisioningFactor.multiply(new BigDecimal(storagePool.getCapacityBytes())).longValue();// All
2001-
// this for the inaccuracy of floats for big number multiplication.
2002+
totalOverProvCapacity = _overProvisioningFactor.multiply(new BigDecimal(storagePool.getCapacityBytes())).longValue();// All this for the inaccuracy of floats for big number multiplication.
20022003
} else {
20032004
totalOverProvCapacity = storagePool.getCapacityBytes();
20042005
}
20052006

20062007
if (capacities.size() == 0) {
20072008
CapacityVO capacity = new CapacityVO(storagePool.getId(), storagePool.getDataCenterId(), storagePool.getPodId(), storagePool.getClusterId(), allocated, totalOverProvCapacity, capacityType);
2009+
CapacityState capacityState = _configMgr.findClusterAllocationState(ApiDBUtils.findClusterById(storagePool.getClusterId())) == AllocationState.Disabled ?
2010+
CapacityState.Disabled : CapacityState.Enabled;
2011+
capacity.setCapacityState(capacityState);
20082012
_capacityDao.persist(capacity);
20092013
} else {
20102014
CapacityVO capacity = capacities.get(0);
@@ -2024,7 +2028,7 @@ public void createCapacityEntry(StoragePoolVO storagePool, short capacityType, l
20242028
s_logger.debug("Successfully set Capacity - " + totalOverProvCapacity + " for capacity type - " + capacityType + " , DataCenterId - "
20252029
+ storagePool.getDataCenterId() + ", HostOrPoolId - " + storagePool.getId() + ", PodId " + storagePool.getPodId());
20262030
}
2027-
2031+
20282032
@Override
20292033
public List<Long> getUpHostsInPool(long poolId) {
20302034
SearchCriteria<Long> sc = UpHostsInPoolSearch.create();

0 commit comments

Comments
 (0)