From 4a7ffb70fab4d3e5d408bb28abd9bbcca874c0da Mon Sep 17 00:00:00 2001 From: nvazquez Date: Mon, 23 Oct 2023 14:00:34 -0300 Subject: [PATCH] In progress add source NAT --- .../agent/api/CreateNsxTier1GatewayCommand.java | 8 +++++++- .../apache/cloudstack/resource/NsxResource.java | 3 ++- .../apache/cloudstack/service/NsxApiClient.java | 17 +++++++++++++++-- .../apache/cloudstack/service/NsxElement.java | 7 ++++++- .../cloudstack/service/NsxServiceImpl.java | 4 ++-- .../cloudstack/resource/NsxResourceTest.java | 2 +- .../cloudstack/service/NsxElementTest.java | 3 ++- .../cloudstack/service/NsxServiceImplTest.java | 2 +- 8 files changed, 36 insertions(+), 10 deletions(-) diff --git a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/agent/api/CreateNsxTier1GatewayCommand.java b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/agent/api/CreateNsxTier1GatewayCommand.java index 02616585f98..004e0a35dce 100644 --- a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/agent/api/CreateNsxTier1GatewayCommand.java +++ b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/agent/api/CreateNsxTier1GatewayCommand.java @@ -21,11 +21,13 @@ import java.util.Objects; public class CreateNsxTier1GatewayCommand extends NsxCommand { private long vpcId; private String vpcName; + private boolean sourceNatEnabled; - public CreateNsxTier1GatewayCommand(long domainId, long accountId, long zoneId, long vpcId, String vpcName) { + public CreateNsxTier1GatewayCommand(long domainId, long accountId, long zoneId, long vpcId, String vpcName, boolean sourceNatEnabled) { super(domainId, accountId, zoneId); this.vpcId = vpcId; this.vpcName = vpcName; + this.sourceNatEnabled = sourceNatEnabled; } public long getVpcId() { @@ -36,6 +38,10 @@ public class CreateNsxTier1GatewayCommand extends NsxCommand { return vpcName; } + public boolean isSourceNatEnabled() { + return sourceNatEnabled; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/resource/NsxResource.java b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/resource/NsxResource.java index ad5ea2b7067..daa22eb4a81 100644 --- a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/resource/NsxResource.java +++ b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/resource/NsxResource.java @@ -254,8 +254,9 @@ public class NsxResource implements ServerResource { private Answer executeRequest(CreateNsxTier1GatewayCommand cmd) { String name = NsxControllerUtils.getTier1GatewayName(cmd.getDomainId(), cmd.getAccountId(), cmd.getZoneId(), cmd.getVpcId()); + boolean sourceNatEnabled = cmd.isSourceNatEnabled(); try { - nsxApiClient.createTier1Gateway(name, tier0Gateway, edgeCluster); + nsxApiClient.createTier1Gateway(name, tier0Gateway, edgeCluster, sourceNatEnabled); return new NsxAnswer(cmd, true, ""); } catch (CloudRuntimeException e) { LOGGER.error(String.format("Cannot create tier 1 gateway %s (VPC: %s): %s", name, cmd.getVpcName(), e.getMessage())); diff --git a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxApiClient.java b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxApiClient.java index 973650db09c..a151726f3a1 100644 --- a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxApiClient.java +++ b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxApiClient.java @@ -48,6 +48,7 @@ import com.vmware.vapi.std.errors.Error; import org.apache.cloudstack.utils.NsxControllerUtils; import org.apache.log4j.Logger; +import java.util.ArrayList; import java.util.List; import java.util.function.Function; @@ -185,13 +186,25 @@ public class NsxApiClient { } } - public void createTier1Gateway(String name, String tier0Gateway, String edgeCluster) { + private List getRouterAdvertisementTypeList(boolean sourceNatEnabled) { + List types = new ArrayList<>(); + types.add(RouteAdvertisementType.TIER1_IPSEC_LOCAL_ENDPOINT.name()); + types.add(RouteAdvertisementType.TIER1_NAT.name()); + if (!sourceNatEnabled) { + types.add(RouteAdvertisementType.TIER1_CONNECTED.name()); + } + return types; + } + + public void createTier1Gateway(String name, String tier0Gateway, String edgeCluster, boolean sourceNatEnabled) { String tier0GatewayPath = TIER_0_GATEWAY_PATH_PREFIX + tier0Gateway; Tier1 tier1 = getTier1Gateway(name); if (tier1 != null) { throw new InvalidParameterValueException(String.format("VPC network with name %s exists in NSX zone", name)); } + List routeAdvertisementTypes = getRouterAdvertisementTypeList(sourceNatEnabled); + Tier1s tier1service = (Tier1s) nsxService.apply(Tier1s.class); tier1 = new Tier1.Builder() .setTier0Path(tier0GatewayPath) @@ -199,7 +212,7 @@ public class NsxApiClient { .setPoolAllocation(PoolAllocation.ROUTING.name()) .setHaMode(HAMode.ACTIVE_STANDBY.name()) .setFailoverMode(FailoverMode.PREEMPTIVE.name()) - .setRouteAdvertisementTypes(List.of(RouteAdvertisementType.TIER1_CONNECTED.name(), RouteAdvertisementType.TIER1_IPSEC_LOCAL_ENDPOINT.name())) + .setRouteAdvertisementTypes(routeAdvertisementTypes) .setId(name) .setDisplayName(name) .build(); diff --git a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxElement.java b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxElement.java index edbc2eebffe..ce95f65af36 100644 --- a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxElement.java +++ b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxElement.java @@ -52,6 +52,7 @@ import com.cloud.network.vpc.NetworkACLItem; import com.cloud.network.vpc.PrivateGateway; import com.cloud.network.vpc.StaticRouteProfile; import com.cloud.network.vpc.Vpc; +import com.cloud.network.vpc.dao.VpcOfferingServiceMapDao; import com.cloud.offering.NetworkOffering; import com.cloud.resource.ResourceManager; import com.cloud.resource.ResourceStateAdapter; @@ -101,6 +102,8 @@ public class NsxElement extends AdapterBase implements DhcpServiceProvider, DnsS NetworkModel networkModel; @Inject DomainDao domainDao; + @Inject + private VpcOfferingServiceMapDao vpcOfferingServiceMapDao; private static final Logger LOGGER = Logger.getLogger(NsxElement.class); @@ -289,7 +292,9 @@ public class NsxElement extends AdapterBase implements DhcpServiceProvider, DnsS } Account account = isNsxAndAccount.second(); DomainVO domain = getDomainFromAccount(account); - return nsxService.createVpcNetwork(vpc.getZoneId(), account.getId(), domain.getId(), vpc.getId(), vpc.getName()); + Network.Service[] services = { Network.Service.SourceNat }; + boolean sourceNatEnabled = vpcOfferingServiceMapDao.areServicesSupportedByVpcOffering(vpc.getVpcOfferingId(), services); + return nsxService.createVpcNetwork(vpc.getZoneId(), account.getId(), domain.getId(), vpc.getId(), vpc.getName(), sourceNatEnabled); } @Override diff --git a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxServiceImpl.java b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxServiceImpl.java index 999f28bde25..d21e2a7eb1b 100644 --- a/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxServiceImpl.java +++ b/plugins/network-elements/nsx/src/main/java/org/apache/cloudstack/service/NsxServiceImpl.java @@ -34,9 +34,9 @@ public class NsxServiceImpl implements NsxService { @Inject VpcDao vpcDao; - public boolean createVpcNetwork(Long zoneId, long accountId, long domainId, long vpcId, String vpcName) { + public boolean createVpcNetwork(Long zoneId, long accountId, long domainId, long vpcId, String vpcName, boolean sourceNatEnabled) { CreateNsxTier1GatewayCommand createNsxTier1GatewayCommand = - new CreateNsxTier1GatewayCommand(domainId, accountId, zoneId, vpcId, vpcName); + new CreateNsxTier1GatewayCommand(domainId, accountId, zoneId, vpcId, vpcName, sourceNatEnabled); NsxAnswer result = nsxControllerUtils.sendNsxCommand(createNsxTier1GatewayCommand, zoneId); return result.getResult(); } diff --git a/plugins/network-elements/nsx/src/test/java/org/apache/cloudstack/resource/NsxResourceTest.java b/plugins/network-elements/nsx/src/test/java/org/apache/cloudstack/resource/NsxResourceTest.java index 9e1a98c854d..bc84c2e31c5 100644 --- a/plugins/network-elements/nsx/src/test/java/org/apache/cloudstack/resource/NsxResourceTest.java +++ b/plugins/network-elements/nsx/src/test/java/org/apache/cloudstack/resource/NsxResourceTest.java @@ -106,7 +106,7 @@ public class NsxResourceTest { @Test public void testCreateNsxTier1Gateway() { NsxCommand command = new CreateNsxTier1GatewayCommand(1L, 2L, - 1L, 3L, "VPC01"); + 1L, 3L, "VPC01", false); NsxAnswer answer = (NsxAnswer) nsxResource.executeRequest(command); assertTrue(answer.getResult()); diff --git a/plugins/network-elements/nsx/src/test/java/org/apache/cloudstack/service/NsxElementTest.java b/plugins/network-elements/nsx/src/test/java/org/apache/cloudstack/service/NsxElementTest.java index 79367a105b4..6e6962556e7 100644 --- a/plugins/network-elements/nsx/src/test/java/org/apache/cloudstack/service/NsxElementTest.java +++ b/plugins/network-elements/nsx/src/test/java/org/apache/cloudstack/service/NsxElementTest.java @@ -42,6 +42,7 @@ import org.mockito.junit.MockitoJUnitRunner; import java.util.List; import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.mock; @@ -115,7 +116,7 @@ public class NsxElementTest { @Test public void testImplementVpc() throws ResourceUnavailableException, InsufficientCapacityException { - when(nsxService.createVpcNetwork(anyLong(), anyLong(), anyLong(), anyLong(), anyString())).thenReturn(true); + when(nsxService.createVpcNetwork(anyLong(), anyLong(), anyLong(), anyLong(), anyString(), anyBoolean())).thenReturn(true); assertTrue(nsxElement.implementVpc(vpc, deployDestination, reservationContext)); } diff --git a/plugins/network-elements/nsx/src/test/java/org/apache/cloudstack/service/NsxServiceImplTest.java b/plugins/network-elements/nsx/src/test/java/org/apache/cloudstack/service/NsxServiceImplTest.java index effca9d4a30..34feb6a2bee 100644 --- a/plugins/network-elements/nsx/src/test/java/org/apache/cloudstack/service/NsxServiceImplTest.java +++ b/plugins/network-elements/nsx/src/test/java/org/apache/cloudstack/service/NsxServiceImplTest.java @@ -67,7 +67,7 @@ public class NsxServiceImplTest { when(nsxControllerUtils.sendNsxCommand(any(CreateNsxTier1GatewayCommand.class), anyLong())).thenReturn(createNsxTier1GatewayAnswer); when(createNsxTier1GatewayAnswer.getResult()).thenReturn(true); - assertTrue(nsxService.createVpcNetwork(1L, 3L, 2L, 5L, "VPC01")); + assertTrue(nsxService.createVpcNetwork(1L, 3L, 2L, 5L, "VPC01", false)); } @Test