mirror of https://github.com/apache/cloudstack.git
CLOUDSTACK-1088: EnableStaticNat error will clear the data in database
The issue occur in two conditions (1) If I use two sessions or browsers to EnableStaticNat on CloudStack UI. one is successful, the other is failed. However, there is no ip in database. (2) If I use API call EnableStaticNat several times The first time succeed, the second failed, the third succeed. the result is success-fail-success-fail-success-fail, which it is not correct. Reported-by: Wei Zhou <w.zhou@leaseweb.com> Reviewed-by: https://reviews.apache.org/r/9254/ Signed-off-by: Prasanna Santhanam <tsp@apache.org>
This commit is contained in:
parent
8234dfa544
commit
2e2ee2f3ed
|
|
@ -412,7 +412,8 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules
|
|||
|
||||
// Verify input parameters
|
||||
boolean performedIpAssoc = false;
|
||||
boolean result = false;
|
||||
boolean isOneToOneNat = ipAddress.isOneToOneNat();
|
||||
Long associatedWithVmId = ipAddress.getAssociatedWithVmId();
|
||||
try {
|
||||
Network network = _networkModel.getNetwork(networkId);
|
||||
if (network == null) {
|
||||
|
|
@ -476,28 +477,26 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules
|
|||
// enable static nat on the backend
|
||||
s_logger.trace("Enabling static nat for ip address " + ipAddress + " and vm id=" + vmId + " on the backend");
|
||||
if (applyStaticNatForIp(ipId, false, caller, false)) {
|
||||
result = true;
|
||||
performedIpAssoc = false; // ignor unassignIPFromVpcNetwork in finally block
|
||||
return true;
|
||||
} else {
|
||||
s_logger.warn("Failed to enable static nat rule for ip address " + ipId + " on the backend");
|
||||
ipAddress.setOneToOneNat(isOneToOneNat);
|
||||
ipAddress.setAssociatedWithVmId(associatedWithVmId);
|
||||
_ipAddressDao.update(ipAddress.getId(), ipAddress);
|
||||
}
|
||||
} else {
|
||||
s_logger.warn("Failed to update ip address " + ipAddress + " in the DB as a part of enableStaticNat");
|
||||
|
||||
}
|
||||
} finally {
|
||||
if (!result) {
|
||||
ipAddress.setOneToOneNat(false);
|
||||
ipAddress.setAssociatedWithVmId(null);
|
||||
_ipAddressDao.update(ipAddress.getId(), ipAddress);
|
||||
|
||||
if (performedIpAssoc) {
|
||||
//if the rule is the last one for the ip address assigned to VPC, unassign it from the network
|
||||
IpAddress ip = _ipAddressDao.findById(ipAddress.getId());
|
||||
_vpcMgr.unassignIPFromVpcNetwork(ip.getId(), networkId);
|
||||
}
|
||||
if (performedIpAssoc) {
|
||||
//if the rule is the last one for the ip address assigned to VPC, unassign it from the network
|
||||
IpAddress ip = _ipAddressDao.findById(ipAddress.getId());
|
||||
_vpcMgr.unassignIPFromVpcNetwork(ip.getId(), networkId);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
return false;
|
||||
}
|
||||
|
||||
protected void isIpReadyForStaticNat(long vmId, IPAddressVO ipAddress, Account caller, long callerUserId)
|
||||
|
|
|
|||
Loading…
Reference in New Issue