This is an automated email from the ASF dual-hosted git repository. pearl11594 pushed a commit to branch netris-integration-upstream in repository https://gitbox.apache.org/repos/asf/cloudstack.git
commit 6e4679212f85f5f41dc8d1d97d8ef19c9b42906a Author: Pearl Dsilva <pearl1...@gmail.com> AuthorDate: Thu Dec 26 08:33:41 2024 -0500 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 <nicovazque...@gmail.com> --- .../java/com/cloud/network/vpc/VpcProvisioningService.java | 2 +- .../api/command/admin/network/CreateNetworkOfferingCmd.java | 3 +-- .../api/command/admin/vpc/CreateVPCOfferingCmd.java | 12 +++++++++--- .../network/contrail/management/ContrailManagerImpl.java | 2 +- .../java/org/apache/cloudstack/service/NetrisElement.java | 1 + .../apache/cloudstack/service/NetrisGuestNetworkGuru.java | 3 ++- .../com/cloud/configuration/ConfigurationManagerImpl.java | 3 +++ .../src/main/java/com/cloud/network/NetworkServiceImpl.java | 6 +++++- .../src/main/java/com/cloud/network/vpc/VpcManagerImpl.java | 11 +++++++---- ui/src/views/offering/AddVpcOffering.vue | 7 +++++++ 10 files changed, 37 insertions(+), 13 deletions(-) diff --git a/api/src/main/java/com/cloud/network/vpc/VpcProvisioningService.java b/api/src/main/java/com/cloud/network/vpc/VpcProvisioningService.java index 10f1ddcc12d..97b95339ecf 100644 --- a/api/src/main/java/com/cloud/network/vpc/VpcProvisioningService.java +++ b/api/src/main/java/com/cloud/network/vpc/VpcProvisioningService.java @@ -37,7 +37,7 @@ public interface VpcProvisioningService { VpcOffering createVpcOffering(String name, String displayText, List<String> supportedServices, Map<String, List<String>> serviceProviders, Map serviceCapabilitystList, NetUtils.InternetProtocol internetProtocol, - Long serviceOfferingId, Boolean forNsx, NetworkOffering.NetworkMode networkMode, + Long serviceOfferingId, String externalProvider, NetworkOffering.NetworkMode networkMode, List<Long> domainIds, List<Long> zoneIds, VpcOffering.State state, NetworkOffering.RoutingMode routingMode, boolean specifyAsNumber); diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java index e2509b7c532..603e34d600b 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java @@ -394,8 +394,7 @@ public class CreateNetworkOfferingCmd extends BaseCmd { private void getServiceProviderMapForExternalProvider(Map<String, List<String>> serviceProviderMap, String provider) { String routerProvider = Boolean.TRUE.equals(getForVpc()) ? VirtualRouterProvider.Type.VPCVirtualRouter.name() : VirtualRouterProvider.Type.VirtualRouter.name(); - List<String> unsupportedServices = new ArrayList<>(List.of("Vpn", "SecurityGroup", "Connectivity", - "Gateway", "BaremetalPxeService")); + List<String> unsupportedServices = new ArrayList<>(List.of("Vpn", "Gateway", "SecurityGroup", "Connectivity", "BaremetalPxeService")); List<String> routerSupported = List.of("Dhcp", "Dns", "UserData"); List<String> allServices = Service.listAllServices().stream().map(Service::getName).collect(Collectors.toList()); if (routerProvider.equals(VirtualRouterProvider.Type.VPCVirtualRouter.name())) { diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/CreateVPCOfferingCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/CreateVPCOfferingCmd.java index dcceb6ada14..1dce0cd6a49 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/CreateVPCOfferingCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/CreateVPCOfferingCmd.java @@ -60,6 +60,7 @@ import static com.cloud.network.Network.Service.SourceNat; import static com.cloud.network.Network.Service.PortForwarding; import static com.cloud.network.Network.Service.NetworkACL; import static com.cloud.network.Network.Service.UserData; +import static com.cloud.network.Network.Service.Gateway; @APICommand(name = "createVPCOffering", description = "Creates VPC offering", responseObject = VpcOfferingResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) @@ -190,6 +191,9 @@ public class CreateVPCOfferingCmd extends BaseAsyncCreateCmd { SourceNat.getName(), PortForwarding.getName())); } + if (NetworkOffering.NetworkMode.ROUTED.name().equalsIgnoreCase(getNetworkMode())) { + supportedServices.add(Gateway.getName()); + } if (getNsxSupportsLbService()) { supportedServices.add(Lb.getName()); } @@ -239,8 +243,10 @@ public class CreateVPCOfferingCmd extends BaseAsyncCreateCmd { } private void getServiceProviderMapForExternalProvider(Map<String, List<String>> serviceProviderMap, String provider) { - List<String> unsupportedServices = List.of("Vpn", "BaremetalPxeService", "SecurityGroup", "Connectivity", - "Gateway", "Firewall"); + List<String> unsupportedServices = Arrays.asList("Vpn", "BaremetalPxeService", "SecurityGroup", "Connectivity", "Firewall"); + if (NetworkOffering.NetworkMode.NATTED.name().equalsIgnoreCase(getNetworkMode())) { + unsupportedServices.add("Gateway"); + } List<String> routerSupported = List.of("Dhcp", "Dns", "UserData"); List<String> allServices = Network.Service.listAllServices().stream().map(Network.Service::getName).collect(Collectors.toList()); for (String service : allServices) { @@ -249,7 +255,7 @@ public class CreateVPCOfferingCmd extends BaseAsyncCreateCmd { if (routerSupported.contains(service)) serviceProviderMap.put(service, List.of(VirtualRouterProvider.Type.VPCVirtualRouter.name())); else if (NetworkOffering.NetworkMode.NATTED.name().equalsIgnoreCase(getNetworkMode()) || - Stream.of(NetworkACL.getName()).anyMatch(s -> s.equalsIgnoreCase(service))) { + Stream.of(NetworkACL.getName(), Gateway.getName()).anyMatch(s -> s.equalsIgnoreCase(service))) { serviceProviderMap.put(service, List.of(provider)); } } diff --git a/plugins/network-elements/juniper-contrail/src/main/java/org/apache/cloudstack/network/contrail/management/ContrailManagerImpl.java b/plugins/network-elements/juniper-contrail/src/main/java/org/apache/cloudstack/network/contrail/management/ContrailManagerImpl.java index 622886e6d83..da08ba2a6c2 100644 --- a/plugins/network-elements/juniper-contrail/src/main/java/org/apache/cloudstack/network/contrail/management/ContrailManagerImpl.java +++ b/plugins/network-elements/juniper-contrail/src/main/java/org/apache/cloudstack/network/contrail/management/ContrailManagerImpl.java @@ -293,7 +293,7 @@ public class ContrailManagerImpl extends ManagerBase implements ContrailManager } serviceProviderMap.put(svc, providerSet); } - vpcOffer = _vpcProvSvc.createVpcOffering(juniperVPCOfferingName, juniperVPCOfferingDisplayText, services, serviceProviderMap, null, null, null, false, null, null, null, VpcOffering.State.Enabled, null, false); + vpcOffer = _vpcProvSvc.createVpcOffering(juniperVPCOfferingName, juniperVPCOfferingDisplayText, services, serviceProviderMap, null, null, null, null, null, null, null, VpcOffering.State.Enabled, null, false); long id = vpcOffer.getId(); _vpcOffDao.update(id, (VpcOfferingVO)vpcOffer); return _vpcOffDao.findById(id); diff --git a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisElement.java b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisElement.java index b74ec53f9f5..44339e38628 100644 --- a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisElement.java +++ b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisElement.java @@ -171,6 +171,7 @@ public class NetrisElement extends AdapterBase implements DhcpServiceProvider, D Map<Network.Capability, String> sourceNatCapabilities = new HashMap<>(); sourceNatCapabilities.put(Network.Capability.RedundantRouter, "true"); sourceNatCapabilities.put(Network.Capability.SupportedSourceNatTypes, "peraccount"); + capabilities.put(Network.Service.Gateway, null); capabilities.put(Network.Service.SourceNat, sourceNatCapabilities); return capabilities; } diff --git a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisGuestNetworkGuru.java b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisGuestNetworkGuru.java index 8fa07f17d40..3bd508b52e3 100644 --- a/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisGuestNetworkGuru.java +++ b/plugins/network-elements/netris/src/main/java/org/apache/cloudstack/service/NetrisGuestNetworkGuru.java @@ -196,8 +196,9 @@ public class NetrisGuestNetworkGuru extends GuestNetworkGuru implements Network dcId); } implemented.setBroadcastUri(Networks.BroadcastDomainType.Netris.toUri(vnet)); + Long networkId = implemented.getId() > 0 ? implemented.getId() : network.getId(); ActionEventUtils.onCompletedActionEvent(CallContext.current().getCallingUserId(), network.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_ZONE_VXLAN_ASSIGN, - "Assigned Zone vNet: " + vnet + " Network Id: " + implemented.getId(), implemented.getId(), ApiCommandResourceType.Network.toString(), 0); + "Assigned Zone vNet: " + vnet + " Network Id: " + networkId, networkId, ApiCommandResourceType.Network.toString(), 0); } else { implemented.setBroadcastUri(network.getBroadcastUri()); } diff --git a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java index c4cefa5899b..5833060af25 100644 --- a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java @@ -6832,6 +6832,9 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati } else { serviceProviderMap.put(Service.Gateway, Sets.newHashSet(Provider.VirtualRouter)); } + } else { + Set<Provider> providers = serviceProviderMap.get(Service.NetworkACL); + serviceProviderMap.put(Service.Gateway, Sets.newHashSet(providers.iterator().next())); } } } diff --git a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java index a430564dbc1..6b5611da7da 100644 --- a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java +++ b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java @@ -32,6 +32,7 @@ import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.Set; @@ -5090,11 +5091,14 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C // validate Services boolean addGatewayService = false; + boolean isRoutedMode = enabledServices.stream().noneMatch(svc -> svc.equalsIgnoreCase(Service.SourceNat.getName())); for (String serviceName : enabledServices) { Network.Service service = Network.Service.getService(serviceName); if (service == null || service == Service.Gateway) { throw new InvalidParameterValueException("Invalid Network Service specified=" + serviceName); - } else if (service == Service.SourceNat) { + } else if (service == Service.SourceNat || + (isRoutedMode && Arrays.asList(Provider.Nsx.getName().toLowerCase(Locale.ROOT), + Provider.Netris.getName().toLowerCase(Locale.ROOT)).contains(providerName.toLowerCase(Locale.ROOT)))) { addGatewayService = true; } diff --git a/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java index 0ae9d3d893d..c47e9b5970b 100644 --- a/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java +++ b/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java @@ -617,7 +617,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis } return createVpcOffering(vpcOfferingName, displayText, supportedServices, - serviceProviderList, serviceCapabilityList, internetProtocol, serviceOfferingId, forNsx, networkMode, + serviceProviderList, serviceCapabilityList, internetProtocol, serviceOfferingId, provider, networkMode, domainIds, zoneIds, (enable ? State.Enabled : State.Disabled), routingMode, specifyAsNumber); } @@ -625,7 +625,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis @ActionEvent(eventType = EventTypes.EVENT_VPC_OFFERING_CREATE, eventDescription = "creating vpc offering", create = true) public VpcOffering createVpcOffering(final String name, final String displayText, final List<String> supportedServices, final Map<String, List<String>> serviceProviders, final Map serviceCapabilityList, final NetUtils.InternetProtocol internetProtocol, final Long serviceOfferingId, - final Boolean forNsx, final NetworkOffering.NetworkMode networkMode, List<Long> domainIds, List<Long> zoneIds, State state, + final String externalProvider, final NetworkOffering.NetworkMode networkMode, List<Long> domainIds, List<Long> zoneIds, State state, NetworkOffering.RoutingMode routingMode, boolean specifyAsNumber) { if (!Ipv6Service.Ipv6OfferingCreationEnabled.value() && !(internetProtocol == null || NetUtils.InternetProtocol.IPv4.equals(internetProtocol))) { @@ -709,7 +709,8 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis Service redundantRouterService = Service.SourceNat; if (CollectionUtils.isNotEmpty(sourceNatServiceProviders)) { svcProviderMap.put(Service.Gateway, sourceNatServiceProviders); - } else if (NetworkOffering.NetworkMode.ROUTED.equals(networkMode)) { + } else if (NetworkOffering.NetworkMode.ROUTED.equals(networkMode) && org.apache.commons.lang3.StringUtils.isBlank(externalProvider)) { + // For Routed mode, add the Gateway service except for external providers such as NSX, Netris to not override the svcProviderMap mapping svcProviderMap.put(Service.Gateway, Sets.newHashSet(Provider.VPCVirtualRouter)); redundantRouterService = Service.Gateway; } @@ -3561,7 +3562,9 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis || vpcOffSvcProvidersMap.get(Service.SourceNat).contains(Provider.Nsx) || vpcOffSvcProvidersMap.get(Service.SourceNat).contains(Provider.Netris))) || (Objects.nonNull(vpcOffSvcProvidersMap.get(Network.Service.Gateway)) - && vpcOffSvcProvidersMap.get(Service.Gateway).contains(Network.Provider.VPCVirtualRouter)); + && (vpcOffSvcProvidersMap.get(Service.Gateway).contains(Network.Provider.VPCVirtualRouter) + || vpcOffSvcProvidersMap.get(Service.Gateway).contains(Provider.Nsx) + || vpcOffSvcProvidersMap.get(Service.Gateway).contains(Network.Provider.Netris))); } @Override diff --git a/ui/src/views/offering/AddVpcOffering.vue b/ui/src/views/offering/AddVpcOffering.vue index d43a55bd856..9acec373514 100644 --- a/ui/src/views/offering/AddVpcOffering.vue +++ b/ui/src/views/offering/AddVpcOffering.vue @@ -585,6 +585,13 @@ export default { services = services.filter(service => { return !['SourceNat', 'StaticNat', 'Lb', 'PortForwarding', 'Vpn'].includes(service.name) }) + if (['NSX', 'Netris'].includes(this.provider)) { + services.push({ + name: 'Gateway', + enabled: true, + provider: [{ name: this.provider }] + }) + } } for (var i in services) { services[i].description = services[i].name