This is an automated email from the ASF dual-hosted git repository. pearl11594 pushed a commit to branch 4.20 in repository https://gitbox.apache.org/repos/asf/cloudstack.git
commit 255a45c4a62accd01feee47695d3a0ec54ccc573 Merge: 45bac89b831 4a1d80ddc8e Author: Pearl Dsilva <[email protected]> AuthorDate: Tue Apr 22 03:31:13 2025 -0400 Merge branch '4.19' of https://github.com/apache/cloudstack into 4.20 .../com/cloud/network/IpAddressManagerImpl.java | 94 +++++++++++++--------- .../java/com/cloud/network/vpc/VpcManagerImpl.java | 28 +++---- 2 files changed, 66 insertions(+), 56 deletions(-) diff --cc server/src/main/java/com/cloud/network/IpAddressManagerImpl.java index 1fa416b643b,63c55966d5b..1c8bf7ae03f --- a/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java +++ b/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java @@@ -1042,32 -1048,44 +1042,44 @@@ public class IpAddressManagerImpl exten @Override public void doInTransactionWithoutResult(TransactionStatus status) { Account owner = _accountMgr.getAccount(addr.getAllocatedToAccountId()); - if (_ipAddressDao.lockRow(addr.getId(), true) != null) { - final IPAddressVO userIp = _ipAddressDao.findById(addr.getId()); - if (userIp.getState() == IpAddress.State.Allocating || addr.getState() == IpAddress.State.Free || addr.getState() == IpAddress.State.Reserved) { - boolean shouldUpdateIpResourceCount = checkIfIpResourceCountShouldBeUpdated(addr); - addr.setState(IpAddress.State.Allocated); - if (_ipAddressDao.update(addr.getId(), addr)) { - // Save usage event - if (owner.getAccountId() != Account.ACCOUNT_ID_SYSTEM) { - VlanVO vlan = _vlanDao.findById(addr.getVlanId()); - String guestType = vlan.getVlanType().toString(); - if (!isIpDedicated(addr)) { - final boolean usageHidden = isUsageHidden(addr); - UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_IP_ASSIGN, owner.getId(), addr.getDataCenterId(), addr.getId(), - addr.getAddress().toString(), addr.isSourceNat(), guestType, addr.getSystem(), usageHidden, - addr.getClass().getName(), addr.getUuid()); - } - if (shouldUpdateIpResourceCount) { - _resourceLimitMgr.incrementResourceCount(owner.getId(), ResourceType.public_ip); - } - } - } else { - logger.error("Failed to mark public IP as allocated: {}", addr); + final IPAddressVO userIp = _ipAddressDao.lockRow(addr.getId(), true); + if (userIp == null) { - s_logger.error(String.format("Failed to acquire row lock to mark public IP as allocated with ID [%s] and address [%s]", addr.getId(), addr.getAddress())); ++ logger.error(String.format("Failed to acquire row lock to mark public IP as allocated with ID [%s] and address [%s]", addr.getId(), addr.getAddress())); + return; + } + + List<IpAddress.State> expectedIpAddressStates = List.of(IpAddress.State.Allocating, IpAddress.State.Free, IpAddress.State.Reserved); + if (!expectedIpAddressStates.contains(userIp.getState())) { - s_logger.debug(String.format("Not marking public IP with ID [%s] and address [%s] as allocated, since it is in the [%s] state.", addr.getId(), addr.getAddress(), userIp.getState())); ++ logger.debug(String.format("Not marking public IP with ID [%s] and address [%s] as allocated, since it is in the [%s] state.", addr.getId(), addr.getAddress(), userIp.getState())); + return; + } + + boolean shouldUpdateIpResourceCount = checkIfIpResourceCountShouldBeUpdated(addr); + addr.setState(IpAddress.State.Allocated); + boolean updatedIpAddress = _ipAddressDao.update(addr.getId(), addr); + if (!updatedIpAddress) { - s_logger.error(String.format("Failed to mark public IP as allocated with ID [%s] and address [%s]", addr.getId(), addr.getAddress())); ++ logger.error(String.format("Failed to mark public IP as allocated with ID [%s] and address [%s]", addr.getId(), addr.getAddress())); + return; + } + + if (owner.getAccountId() != Account.ACCOUNT_ID_SYSTEM) { + if (shouldUpdateIpResourceCount) { + try (CheckedReservation publicIpReservation = new CheckedReservation(owner, ResourceType.public_ip, 1L, reservationDao, _resourceLimitMgr)) { + _resourceLimitMgr.incrementResourceCount(owner.getId(), ResourceType.public_ip); + } catch (Exception e) { + _ipAddressDao.unassignIpAddress(addr.getId()); + throw new CloudRuntimeException(e); } } - } else { - logger.error("Failed to acquire row lock to mark public IP as allocated: {}", addr); + + VlanVO vlan = _vlanDao.findById(addr.getVlanId()); + String guestType = vlan.getVlanType().toString(); + if (!isIpDedicated(addr)) { + final boolean usageHidden = isUsageHidden(addr); + UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_IP_ASSIGN, owner.getId(), addr.getDataCenterId(), addr.getId(), + addr.getAddress().toString(), addr.isSourceNat(), guestType, addr.getSystem(), usageHidden, + addr.getClass().getName(), addr.getUuid()); + } } } }); @@@ -1552,28 -1569,30 +1564,32 @@@ } boolean isSourceNat = isSourceNatAvailableForNetwork(owner, ipToAssoc, network); - s_logger.debug(String.format("Associating IP [%s] to network [%s].", ipToAssoc, network)); + - logger.debug("Associating ip " + ipToAssoc + " to network " + network); ++ logger.debug(String.format("Associating IP [%s] to network [%s].", ipToAssoc, network)); + boolean success = false; 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); + try { + Pair<IPAddressVO, Boolean> updatedIpAddress = Transaction.execute((TransactionCallbackWithException<Pair<IPAddressVO, Boolean>, Exception>) status -> { + IPAddressVO ipAddress = _ipAddressDao.findById(ipId); + ipAddress.setAssociatedWithNetworkId(networkId); + ipAddress.setSourceNat(isSourceNat); + _ipAddressDao.update(ipId, ipAddress); + return new Pair<>(_ipAddressDao.findById(ipId), applyIpAssociations(network, false)); + }); + + ip = updatedIpAddress.first(); + success = updatedIpAddress.second(); if (success) { - logger.debug("Successfully associated ip address " + ip.getAddress().addr() + " to network " + network); - s_logger.debug(String.format("Successfully associated IP address [%s] to network [%s]", ip.getAddress().addr(), network)); ++ logger.debug(String.format("Successfully associated IP address [%s] to network [%s]", ip.getAddress().addr(), network)); } else { - logger.warn("Failed to associate ip address " + ip.getAddress().addr() + " to network " + network); - s_logger.warn(String.format("Failed to associate IP address [%s] to network [%s]", ip.getAddress().addr(), network)); ++ logger.warn(String.format("Failed to associate IP address [%s] to network [%s]", ip.getAddress().addr(), network)); } - return _ipAddressDao.findById(ipId); + return ip; } catch (Exception e) { - 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); + String errorMessage = String.format("Failed to associate IP address [%s] to network [%s]", ipToAssoc, network); - s_logger.error(errorMessage, e); ++ logger.error(errorMessage, e); + throw new CloudRuntimeException(errorMessage, e); } finally { if (!success && releaseOnFailure) { if (ip != null) { diff --cc server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java index d542ffc1346,4882659f1ce..7fcdf5ce56e --- a/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java +++ b/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java @@@ -42,16 -42,6 +42,15 @@@ import javax.annotation.PostConstruct import javax.inject.Inject; import javax.naming.ConfigurationException; +import com.cloud.configuration.ConfigurationManager; +import com.cloud.configuration.ConfigurationManagerImpl; +import com.cloud.bgp.BGPService; +import com.cloud.dc.ASNumberVO; +import com.cloud.dc.dao.ASNumberDao; +import com.cloud.dc.Vlan; +import com.cloud.network.dao.NsxProviderDao; +import com.cloud.network.element.NsxProviderVO; - import com.cloud.resourcelimit.CheckedReservation; +import com.google.common.collect.Sets; import org.apache.cloudstack.acl.ControlledEntity.ACLType; import org.apache.cloudstack.alert.AlertService; import org.apache.cloudstack.annotation.AnnotationService; @@@ -3191,32 -2927,27 +3190,27 @@@ public class VpcManagerImpl extends Man // check permissions _accountMgr.checkAccess(caller, null, false, owner, vpc); - logger.debug("Associating ip " + ipToAssoc + " to vpc " + vpc); - s_logger.debug(String.format("Associating IP [%s] to VPC [%s]", ipToAssoc, vpc)); ++ logger.debug(String.format("Associating IP [%s] to VPC [%s]", ipToAssoc, vpc)); - final boolean isSourceNatFinal = isSrcNatIpRequired(vpc.getVpcOfferingId()) && getExistingSourceNatInVpc(vpc.getAccountId(), vpcId) == null; + final boolean isSourceNatFinal = isSrcNatIpRequired(vpc.getVpcOfferingId()) && getExistingSourceNatInVpc(vpc.getAccountId(), vpcId, false) == null; - try (CheckedReservation publicIpReservation = new CheckedReservation(owner, ResourceType.public_ip, 1l, reservationDao, _resourceLimitMgr)) { - Transaction.execute(new TransactionCallbackNoReturn() { - @Override - public void doInTransactionWithoutResult(final TransactionStatus status) { + try { + IPAddressVO updatedIpAddress = Transaction.execute((TransactionCallbackWithException<IPAddressVO, CloudRuntimeException>) status -> { final IPAddressVO ip = _ipAddressDao.findById(ipId); - // update ip address with networkId ip.setVpcId(vpcId); ip.setSourceNat(isSourceNatFinal); - _ipAddressDao.update(ipId, ip); - - // mark ip as allocated _ipAddrMgr.markPublicIpAsAllocated(ip); - } + return _ipAddressDao.findById(ipId); }); + - s_logger.debug(String.format("Successfully assigned IP [%s] to VPC [%s]", ipToAssoc, vpc)); ++ logger.debug(String.format("Successfully assigned IP [%s] to VPC [%s]", ipToAssoc, vpc)); + CallContext.current().putContextParameter(IpAddress.class, ipToAssoc.getUuid()); + return updatedIpAddress; } catch (Exception e) { - logger.error("Failed to associate ip " + ipToAssoc + " to vpc " + vpc, e); - throw new CloudRuntimeException("Failed to associate ip " + ipToAssoc + " to vpc " + vpc, e); + String errorMessage = String.format("Failed to associate IP address [%s] to VPC [%s]", ipToAssoc, vpc); - s_logger.error(errorMessage, e); ++ logger.error(errorMessage, e); + throw new CloudRuntimeException(errorMessage, e); } - - logger.debug("Successfully assigned ip " + ipToAssoc + " to vpc " + vpc); - CallContext.current().putContextParameter(IpAddress.class, ipToAssoc.getUuid()); - return _ipAddressDao.findById(ipId); } @Override
