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

Reply via email to