Skip to content

Commit 5fc07f8

Browse files
Pearl1594nvazquez
andcommitted
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 3bc5981 commit 5fc07f8

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
@@ -6832,6 +6832,9 @@ public NetworkOfferingVO createNetworkOffering(final String name, final String d
68326832
} else {
68336833
serviceProviderMap.put(Service.Gateway, Sets.newHashSet(Provider.VirtualRouter));
68346834
}
6835+
} else {
6836+
Set<Provider> providers = serviceProviderMap.get(Service.NetworkACL);
6837+
serviceProviderMap.put(Service.Gateway, Sets.newHashSet(providers.iterator().next()));
68356838
}
68366839
}
68376840
}

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;
@@ -5090,11 +5091,14 @@ public PhysicalNetworkServiceProvider addProviderToPhysicalNetwork(Long physical
50905091

50915092
// validate Services
50925093
boolean addGatewayService = false;
5094+
boolean isRoutedMode = enabledServices.stream().noneMatch(svc -> svc.equalsIgnoreCase(Service.SourceNat.getName()));
50935095
for (String serviceName : enabledServices) {
50945096
Network.Service service = Network.Service.getService(serviceName);
50955097
if (service == null || service == Service.Gateway) {
50965098
throw new InvalidParameterValueException("Invalid Network Service specified=" + serviceName);
5097-
} else if (service == Service.SourceNat) {
5099+
} else if (service == Service.SourceNat ||
5100+
(isRoutedMode && Arrays.asList(Provider.Nsx.getName().toLowerCase(Locale.ROOT),
5101+
Provider.Netris.getName().toLowerCase(Locale.ROOT)).contains(providerName.toLowerCase(Locale.ROOT)))) {
50985102
addGatewayService = true;
50995103
}
51005104

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

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

619619
return createVpcOffering(vpcOfferingName, displayText, supportedServices,
620-
serviceProviderList, serviceCapabilityList, internetProtocol, serviceOfferingId, forNsx, networkMode,
620+
serviceProviderList, serviceCapabilityList, internetProtocol, serviceOfferingId, provider, networkMode,
621621
domainIds, zoneIds, (enable ? State.Enabled : State.Disabled), routingMode, specifyAsNumber);
622622
}
623623

624624
@Override
625625
@ActionEvent(eventType = EventTypes.EVENT_VPC_OFFERING_CREATE, eventDescription = "creating vpc offering", create = true)
626626
public VpcOffering createVpcOffering(final String name, final String displayText, final List<String> supportedServices, final Map<String, List<String>> serviceProviders,
627627
final Map serviceCapabilityList, final NetUtils.InternetProtocol internetProtocol, final Long serviceOfferingId,
628-
final Boolean forNsx, final NetworkOffering.NetworkMode networkMode, List<Long> domainIds, List<Long> zoneIds, State state,
628+
final String externalProvider, final NetworkOffering.NetworkMode networkMode, List<Long> domainIds, List<Long> zoneIds, State state,
629629
NetworkOffering.RoutingMode routingMode, boolean specifyAsNumber) {
630630

631631
if (!Ipv6Service.Ipv6OfferingCreationEnabled.value() && !(internetProtocol == null || NetUtils.InternetProtocol.IPv4.equals(internetProtocol))) {
@@ -709,7 +709,8 @@ public VpcOffering createVpcOffering(final String name, final String displayText
709709
Service redundantRouterService = Service.SourceNat;
710710
if (CollectionUtils.isNotEmpty(sourceNatServiceProviders)) {
711711
svcProviderMap.put(Service.Gateway, sourceNatServiceProviders);
712-
} else if (NetworkOffering.NetworkMode.ROUTED.equals(networkMode)) {
712+
} else if (NetworkOffering.NetworkMode.ROUTED.equals(networkMode) && org.apache.commons.lang3.StringUtils.isBlank(externalProvider)) {
713+
// For Routed mode, add the Gateway service except for external providers such as NSX, Netris to not override the svcProviderMap mapping
713714
svcProviderMap.put(Service.Gateway, Sets.newHashSet(Provider.VPCVirtualRouter));
714715
redundantRouterService = Service.Gateway;
715716
}
@@ -3561,7 +3562,9 @@ public boolean isSrcNatIpRequired(long vpcOfferingId) {
35613562
|| vpcOffSvcProvidersMap.get(Service.SourceNat).contains(Provider.Nsx)
35623563
|| vpcOffSvcProvidersMap.get(Service.SourceNat).contains(Provider.Netris)))
35633564
|| (Objects.nonNull(vpcOffSvcProvidersMap.get(Network.Service.Gateway))
3564-
&& vpcOffSvcProvidersMap.get(Service.Gateway).contains(Network.Provider.VPCVirtualRouter));
3565+
&& (vpcOffSvcProvidersMap.get(Service.Gateway).contains(Network.Provider.VPCVirtualRouter)
3566+
|| vpcOffSvcProvidersMap.get(Service.Gateway).contains(Provider.Nsx)
3567+
|| vpcOffSvcProvidersMap.get(Service.Gateway).contains(Network.Provider.Netris)));
35653568
}
35663569

35673570
@Override

ui/src/views/offering/AddVpcOffering.vue

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -585,6 +585,13 @@ export default {
585585
services = services.filter(service => {
586586
return !['SourceNat', 'StaticNat', 'Lb', 'PortForwarding', 'Vpn'].includes(service.name)
587587
})
588+
if (['NSX', 'Netris'].includes(this.provider)) {
589+
services.push({
590+
name: 'Gateway',
591+
enabled: true,
592+
provider: [{ name: this.provider }]
593+
})
594+
}
588595
}
589596
for (var i in services) {
590597
services[i].description = services[i].name

0 commit comments

Comments
 (0)