|
37 | 37 | import com.cloud.dc.dao.VlanDao; |
38 | 38 | import com.cloud.deploy.DeployDestination; |
39 | 39 | import com.cloud.exception.ConcurrentOperationException; |
| 40 | +import com.cloud.exception.InsufficientAddressCapacityException; |
40 | 41 | import com.cloud.exception.InsufficientCapacityException; |
41 | 42 | import com.cloud.exception.ResourceUnavailableException; |
42 | 43 | import com.cloud.host.dao.HostDao; |
|
54 | 55 | import com.cloud.network.dao.PhysicalNetworkVO; |
55 | 56 | import com.cloud.network.PhysicalNetworkServiceProvider; |
56 | 57 | import com.cloud.network.PublicIpAddress; |
| 58 | +import com.cloud.network.addr.PublicIp; |
57 | 59 | import com.cloud.network.dao.FirewallRulesDao; |
58 | 60 | import com.cloud.network.dao.IPAddressDao; |
59 | 61 | import com.cloud.network.dao.IPAddressVO; |
@@ -444,6 +446,29 @@ public boolean implement(Network network, NetworkOffering offering, DeployDestin |
444 | 446 | return false; |
445 | 447 | } |
446 | 448 |
|
| 449 | + // Step 3: Configure source NAT if supported. |
| 450 | + if (canHandle(network, Service.SourceNat)) { |
| 451 | + try { |
| 452 | + Account owner = context != null ? context.getAccount() : null; |
| 453 | + PublicIp sourceNatIp = null; |
| 454 | + if (owner != null) { |
| 455 | + sourceNatIp = ipAddressManager.assignSourceNatIpAddressToGuestNetwork(owner, network); |
| 456 | + } |
| 457 | + if (sourceNatIp == null) { |
| 458 | + PublicIpAddress existingIp = networkModel.getSourceNatIpAddressForGuestNetwork(owner, network); |
| 459 | + if (existingIp != null) { |
| 460 | + applyIps(network, List.of(existingIp), Set.of(Service.SourceNat)); |
| 461 | + } |
| 462 | + } else { |
| 463 | + applyIps(network, List.of(sourceNatIp), Set.of(Service.SourceNat)); |
| 464 | + } |
| 465 | + } catch (InsufficientAddressCapacityException e) { |
| 466 | + logger.warn("Could not assign source NAT IP for network {}: {}", network.getId(), e.getMessage()); |
| 467 | + } catch (Exception e) { |
| 468 | + logger.warn("Failed to configure source NAT IP for network {}: {}", network.getId(), e.getMessage(), e); |
| 469 | + } |
| 470 | + } |
| 471 | + |
447 | 472 | return true; |
448 | 473 | } |
449 | 474 |
|
|
0 commit comments