This is an automated email from the ASF dual-hosted git repository.
dahn pushed a commit to branch 4.19
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/4.19 by this push:
new e16a9715111 Fix resource count discrepancy while associating IP
address to a network or vpc (#9563)
e16a9715111 is described below
commit e16a971511137e47bdaa990ba80a647dcf23e56d
Author: Vishesh <[email protected]>
AuthorDate: Thu Sep 19 14:36:00 2024 +0530
Fix resource count discrepancy while associating IP address to a network or
vpc (#9563)
---
.../com/cloud/network/IpAddressManagerImpl.java | 22 +++++++++++++++-------
.../java/com/cloud/network/vpc/VpcManagerImpl.java | 19 ++++++++++++++-----
2 files changed, 29 insertions(+), 12 deletions(-)
diff --git a/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java
b/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java
index c8ac0c1016b..261dc529434 100644
--- a/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java
+++ b/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java
@@ -35,6 +35,7 @@ import javax.inject.Inject;
import com.cloud.network.dao.PublicIpQuarantineDao;
import com.cloud.network.vo.PublicIpQuarantineVO;
+import com.cloud.resourcelimit.CheckedReservation;
import org.apache.cloudstack.acl.ControlledEntity.ACLType;
import org.apache.cloudstack.acl.SecurityChecker.AccessType;
import org.apache.cloudstack.annotation.AnnotationService;
@@ -53,6 +54,7 @@ import org.apache.cloudstack.region.PortableIp;
import org.apache.cloudstack.region.PortableIpDao;
import org.apache.cloudstack.region.PortableIpVO;
import org.apache.cloudstack.region.Region;
+import org.apache.cloudstack.reservation.dao.ReservationDao;
import org.apache.commons.collections.CollectionUtils;
import org.apache.log4j.Logger;
@@ -261,6 +263,8 @@ public class IpAddressManagerImpl extends ManagerBase
implements IpAddressManage
@Inject
ResourceLimitService _resourceLimitMgr;
+ @Inject
+ ReservationDao reservationDao;
@Inject
NetworkOfferingServiceMapDao _ntwkOfferingSrvcDao;
@Inject
@@ -1556,14 +1560,15 @@ public class IpAddressManagerImpl extends ManagerBase
implements IpAddressManage
s_logger.debug("Associating ip " + ipToAssoc + " to network " +
network);
- IPAddressVO ip = _ipAddressDao.findById(ipId);
- //update ip address with networkId
- ip.setAssociatedWithNetworkId(networkId);
- ip.setSourceNat(isSourceNat);
- _ipAddressDao.update(ipId, ip);
-
boolean success = false;
- try {
+ IPAddressVO ip = null;
+ try (CheckedReservation publicIpReservation = new
CheckedReservation(owner, ResourceType.public_ip, 1l, reservationDao,
_resourceLimitMgr)) {
+ ip = _ipAddressDao.findById(ipId);
+ //update ip address with networkId
+ ip.setAssociatedWithNetworkId(networkId);
+ ip.setSourceNat(isSourceNat);
+ _ipAddressDao.update(ipId, ip);
+
success = applyIpAssociations(network, false);
if (success) {
s_logger.debug("Successfully associated ip address " +
ip.getAddress().addr() + " to network " + network);
@@ -1571,6 +1576,9 @@ public class IpAddressManagerImpl extends ManagerBase
implements IpAddressManage
s_logger.warn("Failed to associate ip address " +
ip.getAddress().addr() + " to network " + network);
}
return _ipAddressDao.findById(ipId);
+ } catch (Exception e) {
+ s_logger.error(String.format("Failed to associate ip address %s to
network %s", ipToAssoc, network), e);
+ throw new CloudRuntimeException(String.format("Failed to associate
ip address %s to network %s", ipToAssoc, network), e);
} finally {
if (!success && releaseOnFailure) {
if (ip != null) {
diff --git a/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java
b/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java
index c9391a32167..ce3f083135e 100644
--- a/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java
+++ b/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java
@@ -42,6 +42,7 @@ import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.naming.ConfigurationException;
+import com.cloud.resourcelimit.CheckedReservation;
import org.apache.cloudstack.acl.ControlledEntity.ACLType;
import org.apache.cloudstack.alert.AlertService;
import org.apache.cloudstack.annotation.AnnotationService;
@@ -63,6 +64,7 @@ import
org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationSe
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
import org.apache.cloudstack.managed.context.ManagedContextRunnable;
import org.apache.cloudstack.query.QueryService;
+import org.apache.cloudstack.reservation.dao.ReservationDao;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.log4j.Logger;
@@ -237,6 +239,8 @@ public class VpcManagerImpl extends ManagerBase implements
VpcManager, VpcProvis
@Inject
ResourceLimitService _resourceLimitMgr;
@Inject
+ ReservationDao reservationDao;
+ @Inject
VpcServiceMapDao _vpcSrvcDao;
@Inject
DataCenterDao _dcDao;
@@ -2927,9 +2931,10 @@ public class VpcManagerImpl extends ManagerBase
implements VpcManager, VpcProvis
s_logger.debug("Associating ip " + ipToAssoc + " to vpc " + vpc);
final boolean isSourceNatFinal =
isSrcNatIpRequired(vpc.getVpcOfferingId()) &&
getExistingSourceNatInVpc(vpc.getAccountId(), vpcId) == null;
- Transaction.execute(new TransactionCallbackNoReturn() {
- @Override
- public void doInTransactionWithoutResult(final TransactionStatus
status) {
+ try (CheckedReservation publicIpReservation = new
CheckedReservation(owner, ResourceType.public_ip, 1l, reservationDao,
_resourceLimitMgr)) {
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(final
TransactionStatus status) {
final IPAddressVO ip = _ipAddressDao.findById(ipId);
// update ip address with networkId
ip.setVpcId(vpcId);
@@ -2939,8 +2944,12 @@ public class VpcManagerImpl extends ManagerBase
implements VpcManager, VpcProvis
// mark ip as allocated
_ipAddrMgr.markPublicIpAsAllocated(ip);
- }
- });
+ }
+ });
+ } catch (Exception e) {
+ s_logger.error("Failed to associate ip " + ipToAssoc + " to vpc "
+ vpc, e);
+ throw new CloudRuntimeException("Failed to associate ip " +
ipToAssoc + " to vpc " + vpc, e);
+ }
s_logger.debug("Successfully assigned ip " + ipToAssoc + " to vpc " +
vpc);
CallContext.current().putContextParameter(IpAddress.class,
ipToAssoc.getUuid());