Skip to content

Commit 610fd91

Browse files
Pearl1594nvazquez
andauthored
Add support for Gateway service for Netris VPC and network offerings (#39)
* Add support for Gateway service for Netris VPC and network offerings * Restore UserData service * add gateway only to vpc service * Add support for gateway service for external network providers for networks in routed mode * add support for gateway svc * Revert "add support for gateway svc" This reverts commit 06645cd1c6d08a81ede5d1431497ea3f2efdc5dc. * Fix VPC offering creation * Fix VR public NIC after Gateway service is set to Netris --------- Co-authored-by: nvazquez <[email protected]>
1 parent 8659d96 commit 610fd91

File tree

10 files changed

+37
-13
lines changed

10 files changed

+37
-13
lines changed

api/src/main/java/com/cloud/network/vpc/VpcProvisioningService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public interface VpcProvisioningService {
3737
VpcOffering createVpcOffering(String name, String displayText, List<String> supportedServices,
3838
Map<String, List<String>> serviceProviders,
3939
Map serviceCapabilitystList, NetUtils.InternetProtocol internetProtocol,
40-
Long serviceOfferingId, Boolean forNsx, NetworkOffering.NetworkMode networkMode,
40+
Long serviceOfferingId, String externalProvider, NetworkOffering.NetworkMode networkMode,
4141
List<Long> domainIds, List<Long> zoneIds, VpcOffering.State state,
4242
NetworkOffering.RoutingMode routingMode, boolean specifyAsNumber);
4343

api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -394,8 +394,7 @@ public Map<String, List<String>> getServiceProviders() {
394394
private void getServiceProviderMapForExternalProvider(Map<String, List<String>> serviceProviderMap, String provider) {
395395
String routerProvider = Boolean.TRUE.equals(getForVpc()) ? VirtualRouterProvider.Type.VPCVirtualRouter.name() :
396396
VirtualRouterProvider.Type.VirtualRouter.name();
397-
List<String> unsupportedServices = new ArrayList<>(List.of("Vpn", "SecurityGroup", "Connectivity",
398-
"Gateway", "BaremetalPxeService"));
397+
List<String> unsupportedServices = new ArrayList<>(List.of("Vpn", "Gateway", "SecurityGroup", "Connectivity", "BaremetalPxeService"));
399398
List<String> routerSupported = List.of("Dhcp", "Dns", "UserData");
400399
List<String> allServices = Service.listAllServices().stream().map(Service::getName).collect(Collectors.toList());
401400
if (routerProvider.equals(VirtualRouterProvider.Type.VPCVirtualRouter.name())) {

api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/CreateVPCOfferingCmd.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
import static com.cloud.network.Network.Service.PortForwarding;
6161
import static com.cloud.network.Network.Service.NetworkACL;
6262
import static com.cloud.network.Network.Service.UserData;
63+
import static com.cloud.network.Network.Service.Gateway;
6364

6465
@APICommand(name = "createVPCOffering", description = "Creates VPC offering", responseObject = VpcOfferingResponse.class,
6566
requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
@@ -190,6 +191,9 @@ public List<String> getSupportedServices() {
190191
SourceNat.getName(),
191192
PortForwarding.getName()));
192193
}
194+
if (NetworkOffering.NetworkMode.ROUTED.name().equalsIgnoreCase(getNetworkMode())) {
195+
supportedServices.add(Gateway.getName());
196+
}
193197
if (getNsxSupportsLbService()) {
194198
supportedServices.add(Lb.getName());
195199
}
@@ -239,8 +243,10 @@ public Map<String, List<String>> getServiceProviders() {
239243
}
240244

241245
private void getServiceProviderMapForExternalProvider(Map<String, List<String>> serviceProviderMap, String provider) {
242-
List<String> unsupportedServices = List.of("Vpn", "BaremetalPxeService", "SecurityGroup", "Connectivity",
243-
"Gateway", "Firewall");
246+
List<String> unsupportedServices = Arrays.asList("Vpn", "BaremetalPxeService", "SecurityGroup", "Connectivity", "Firewall");
247+
if (NetworkOffering.NetworkMode.NATTED.name().equalsIgnoreCase(getNetworkMode())) {
248+
unsupportedServices.add("Gateway");
249+
}
244250
List<String> routerSupported = List.of("Dhcp", "Dns", "UserData");
245251
List<String> allServices = Network.Service.listAllServices().stream().map(Network.Service::getName).collect(Collectors.toList());
246252
for (String service : allServices) {
@@ -249,7 +255,7 @@ private void getServiceProviderMapForExternalProvider(Map<String, List<String>>
249255
if (routerSupported.contains(service))
250256
serviceProviderMap.put(service, List.of(VirtualRouterProvider.Type.VPCVirtualRouter.name()));
251257
else if (NetworkOffering.NetworkMode.NATTED.name().equalsIgnoreCase(getNetworkMode()) ||
252-
Stream.of(NetworkACL.getName()).anyMatch(s -> s.equalsIgnoreCase(service))) {
258+
Stream.of(NetworkACL.getName(), Gateway.getName()).anyMatch(s -> s.equalsIgnoreCase(service))) {
253259
serviceProviderMap.put(service, List.of(provider));
254260
}
255261
}

plugins/network-elements/juniper-contrail/src/main/java/org/apache/cloudstack/network/contrail/management/ContrailManagerImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ private VpcOffering locateVpcOffering() {
293293
}
294294
serviceProviderMap.put(svc, providerSet);
295295
}
296-
vpcOffer = _vpcProvSvc.createVpcOffering(juniperVPCOfferingName, juniperVPCOfferingDisplayText, services, serviceProviderMap, null, null, null, false, null, null, null, VpcOffering.State.Enabled, null, false);
296+
vpcOffer = _vpcProvSvc.createVpcOffering(juniperVPCOfferingName, juniperVPCOfferingDisplayText, services, serviceProviderMap, null, null, null, null, null, null, null, VpcOffering.State.Enabled, null, false);
297297
long id = vpcOffer.getId();
298298
_vpcOffDao.update(id, (VpcOfferingVO)vpcOffer);
299299
return _vpcOffDao.findById(id);

plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisElement.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ private static Map<Network.Service, Map<Network.Capability, String>> initCapabil
171171
Map<Network.Capability, String> sourceNatCapabilities = new HashMap<>();
172172
sourceNatCapabilities.put(Network.Capability.RedundantRouter, "true");
173173
sourceNatCapabilities.put(Network.Capability.SupportedSourceNatTypes, "peraccount");
174+
capabilities.put(Network.Service.Gateway, null);
174175
capabilities.put(Network.Service.SourceNat, sourceNatCapabilities);
175176
return capabilities;
176177
}

plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisGuestNetworkGuru.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,8 +196,9 @@ protected void allocateVnet(Network network, NetworkVO implemented, long dcId, l
196196
dcId);
197197
}
198198
implemented.setBroadcastUri(Networks.BroadcastDomainType.Netris.toUri(vnet));
199+
Long networkId = implemented.getId() > 0 ? implemented.getId() : network.getId();
199200
ActionEventUtils.onCompletedActionEvent(CallContext.current().getCallingUserId(), network.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_ZONE_VXLAN_ASSIGN,
200-
"Assigned Zone vNet: " + vnet + " Network Id: " + implemented.getId(), implemented.getId(), ApiCommandResourceType.Network.toString(), 0);
201+
"Assigned Zone vNet: " + vnet + " Network Id: " + networkId, networkId, ApiCommandResourceType.Network.toString(), 0);
201202
} else {
202203
implemented.setBroadcastUri(network.getBroadcastUri());
203204
}

server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6741,6 +6741,9 @@ public NetworkOfferingVO createNetworkOffering(final String name, final String d
67416741
} else {
67426742
serviceProviderMap.put(Service.Gateway, Sets.newHashSet(Provider.VirtualRouter));
67436743
}
6744+
} else {
6745+
Set<Provider> providers = serviceProviderMap.get(Service.NetworkACL);
6746+
serviceProviderMap.put(Service.Gateway, Sets.newHashSet(providers.iterator().next()));
67446747
}
67456748
}
67466749
}

server/src/main/java/com/cloud/network/NetworkServiceImpl.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import java.util.HashMap;
3333
import java.util.HashSet;
3434
import java.util.List;
35+
import java.util.Locale;
3536
import java.util.Map;
3637
import java.util.Objects;
3738
import java.util.Set;
@@ -5084,11 +5085,14 @@ public PhysicalNetworkServiceProvider addProviderToPhysicalNetwork(Long physical
50845085

50855086
// validate Services
50865087
boolean addGatewayService = false;
5088+
boolean isRoutedMode = enabledServices.stream().noneMatch(svc -> svc.equalsIgnoreCase(Service.SourceNat.getName()));
50875089
for (String serviceName : enabledServices) {
50885090
Network.Service service = Network.Service.getService(serviceName);
50895091
if (service == null || service == Service.Gateway) {
50905092
throw new InvalidParameterValueException("Invalid Network Service specified=" + serviceName);
5091-
} else if (service == Service.SourceNat) {
5093+
} else if (service == Service.SourceNat ||
5094+
(isRoutedMode && Arrays.asList(Provider.Nsx.getName().toLowerCase(Locale.ROOT),
5095+
Provider.Netris.getName().toLowerCase(Locale.ROOT)).contains(providerName.toLowerCase(Locale.ROOT)))) {
50925096
addGatewayService = true;
50935097
}
50945098

server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -605,15 +605,15 @@ public VpcOffering createVpcOffering(CreateVPCOfferingCmd cmd) {
605605
}
606606

607607
return createVpcOffering(vpcOfferingName, displayText, supportedServices,
608-
serviceProviderList, serviceCapabilityList, internetProtocol, serviceOfferingId, forNsx, networkMode,
608+
serviceProviderList, serviceCapabilityList, internetProtocol, serviceOfferingId, provider, networkMode,
609609
domainIds, zoneIds, (enable ? State.Enabled : State.Disabled), routingMode, specifyAsNumber);
610610
}
611611

612612
@Override
613613
@ActionEvent(eventType = EventTypes.EVENT_VPC_OFFERING_CREATE, eventDescription = "creating vpc offering", create = true)
614614
public VpcOffering createVpcOffering(final String name, final String displayText, final List<String> supportedServices, final Map<String, List<String>> serviceProviders,
615615
final Map serviceCapabilityList, final NetUtils.InternetProtocol internetProtocol, final Long serviceOfferingId,
616-
final Boolean forNsx, final NetworkOffering.NetworkMode networkMode, List<Long> domainIds, List<Long> zoneIds, State state,
616+
final String externalProvider, final NetworkOffering.NetworkMode networkMode, List<Long> domainIds, List<Long> zoneIds, State state,
617617
NetworkOffering.RoutingMode routingMode, boolean specifyAsNumber) {
618618

619619
if (!Ipv6Service.Ipv6OfferingCreationEnabled.value() && !(internetProtocol == null || NetUtils.InternetProtocol.IPv4.equals(internetProtocol))) {
@@ -697,7 +697,8 @@ public VpcOffering createVpcOffering(final String name, final String displayText
697697
Service redundantRouterService = Service.SourceNat;
698698
if (CollectionUtils.isNotEmpty(sourceNatServiceProviders)) {
699699
svcProviderMap.put(Service.Gateway, sourceNatServiceProviders);
700-
} else if (NetworkOffering.NetworkMode.ROUTED.equals(networkMode)) {
700+
} else if (NetworkOffering.NetworkMode.ROUTED.equals(networkMode) && org.apache.commons.lang3.StringUtils.isBlank(externalProvider)) {
701+
// For Routed mode, add the Gateway service except for external providers such as NSX, Netris to not override the svcProviderMap mapping
701702
svcProviderMap.put(Service.Gateway, Sets.newHashSet(Provider.VPCVirtualRouter));
702703
redundantRouterService = Service.Gateway;
703704
}
@@ -3540,7 +3541,9 @@ public boolean isSrcNatIpRequired(long vpcOfferingId) {
35403541
|| vpcOffSvcProvidersMap.get(Service.SourceNat).contains(Provider.Nsx)
35413542
|| vpcOffSvcProvidersMap.get(Service.SourceNat).contains(Provider.Netris)))
35423543
|| (Objects.nonNull(vpcOffSvcProvidersMap.get(Network.Service.Gateway))
3543-
&& vpcOffSvcProvidersMap.get(Service.Gateway).contains(Network.Provider.VPCVirtualRouter));
3544+
&& (vpcOffSvcProvidersMap.get(Service.Gateway).contains(Network.Provider.VPCVirtualRouter)
3545+
|| vpcOffSvcProvidersMap.get(Service.Gateway).contains(Provider.Nsx)
3546+
|| vpcOffSvcProvidersMap.get(Service.Gateway).contains(Network.Provider.Netris)));
35443547
}
35453548

35463549
@Override

ui/src/views/offering/AddVpcOffering.vue

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -572,6 +572,13 @@ export default {
572572
services = services.filter(service => {
573573
return !['SourceNat', 'StaticNat', 'Lb', 'PortForwarding', 'Vpn'].includes(service.name)
574574
})
575+
if (['NSX', 'Netris'].includes(this.provider)) {
576+
services.push({
577+
name: 'Gateway',
578+
enabled: true,
579+
provider: [{ name: this.provider }]
580+
})
581+
}
575582
}
576583
for (var i in services) {
577584
services[i].description = services[i].name

0 commit comments

Comments
 (0)