This is an automated email from the ASF dual-hosted git repository.

pearl11594 pushed a commit to branch nsx-network-offering-enh
in repository https://gitbox.apache.org/repos/asf/cloudstack.git

commit caa66b026f4e19a4d7d09c9833884d9b099406e9
Author: Pearl Dsilva <[email protected]>
AuthorDate: Mon Jan 15 19:01:26 2024 -0500

    NSX: Make LB service selectable in network offering
---
 .../org/apache/cloudstack/api/ApiConstants.java    |  1 +
 .../admin/network/CreateNetworkOfferingCmd.java    | 19 ++++++++++++--
 .../command/admin/vpc/CreateVPCOfferingCmd.java    | 21 ++++++++++++---
 ui/public/locales/en.json                          |  1 +
 ui/src/views/offering/AddNetworkOffering.vue       | 29 ++++++++++++++++++++-
 ui/src/views/offering/AddVpcOffering.vue           | 30 +++++++++++++++++++++-
 6 files changed, 94 insertions(+), 7 deletions(-)

diff --git a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java 
b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java
index 97f14f5cda6..51523b1863e 100644
--- a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java
+++ b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java
@@ -824,6 +824,7 @@ public class ApiConstants {
     public static final String SPLIT_CONNECTIONS = "splitconnections";
     public static final String FOR_VPC = "forvpc";
     public static final String FOR_NSX = "fornsx";
+    public static final String NSX_SUPPORT_LB = "nsxsupportlb";
     public static final String FOR_TUNGSTEN = "fortungsten";
     public static final String SHRINK_OK = "shrinkok";
     public static final String NICIRA_NVP_DEVICE_ID = "nvpdeviceid";
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 93de44f9291..ca9d0e2c325 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
@@ -154,6 +154,12 @@ public class CreateNetworkOfferingCmd extends BaseCmd {
             since = "4.20.0")
     private String nsxMode;
 
+    @Parameter(name = ApiConstants.NSX_SUPPORT_LB,
+            type = CommandType.BOOLEAN,
+            description = "true if network offering for NSX network offering 
supports Load balancer service.",
+            since = "4.20.0")
+    private Boolean nsxSupportsLbService;
+
     @Parameter(name = ApiConstants.FOR_TUNGSTEN,
             type = CommandType.BOOLEAN,
             description = "true if network offering is meant to be used for 
Tungsten-Fabric, false otherwise.")
@@ -247,9 +253,11 @@ public class CreateNetworkOfferingCmd extends BaseCmd {
                     StaticNat.getName(),
                     SourceNat.getName(),
                     PortForwarding.getName(),
-                    UserData.getName(),
-                    Lb.getName()
+                    UserData.getName()
             ));
+            if (Boolean.TRUE.equals(getNsxSupportsLbService())) {
+                services.add(Lb.getName());
+            }
             if (Boolean.TRUE.equals(forVpc)) {
                 services.add(NetworkACL.getName());
             } else {
@@ -294,6 +302,10 @@ public class CreateNetworkOfferingCmd extends BaseCmd {
         return nsxMode;
     }
 
+    public Boolean getNsxSupportsLbService() {
+        return BooleanUtils.isTrue(nsxSupportsLbService);
+    }
+
     public Boolean getForTungsten() {
         return forTungsten;
     }
@@ -356,6 +368,9 @@ public class CreateNetworkOfferingCmd extends BaseCmd {
                 serviceProviderMap.put(service, List.of(routerProvider));
             else
                 serviceProviderMap.put(service, 
List.of(Network.Provider.Nsx.getName()));
+            if (Boolean.FALSE.equals(getNsxSupportsLbService())) {
+                serviceProviderMap.remove(Lb.getName());
+            }
         }
     }
 
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 a6601626803..1c899b4f84f 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
@@ -126,6 +126,12 @@ public class CreateVPCOfferingCmd extends 
BaseAsyncCreateCmd {
             since = "4.20.0")
     private String nsxMode;
 
+    @Parameter(name = ApiConstants.NSX_SUPPORT_LB,
+            type = CommandType.BOOLEAN,
+            description = "true if network offering for NSX VPC offering 
supports Load balancer service.",
+            since = "4.20.0")
+    private Boolean nsxSupportsLbService;
+
     @Parameter(name = ApiConstants.ENABLE,
             type = CommandType.BOOLEAN,
             description = "set to true if the offering is to be enabled during 
creation. Default is false",
@@ -149,16 +155,18 @@ public class CreateVPCOfferingCmd extends 
BaseAsyncCreateCmd {
             throw new InvalidParameterValueException("Supported services needs 
to be provided");
         }
         if (isForNsx()) {
-            return List.of(
+            supportedServices = new ArrayList<>(List.of(
                     Dhcp.getName(),
                     Dns.getName(),
-                    Lb.getName(),
                     StaticNat.getName(),
                     SourceNat.getName(),
                     NetworkACL.getName(),
                     PortForwarding.getName(),
                     UserData.getName()
-                    );
+                    ));
+            if (Boolean.TRUE.equals(getNsxSupportsLbService())) {
+                supportedServices.add(Lb.getName());
+            }
         }
         return supportedServices;
     }
@@ -171,6 +179,10 @@ public class CreateVPCOfferingCmd extends 
BaseAsyncCreateCmd {
         return nsxMode;
     }
 
+    public Boolean getNsxSupportsLbService() {
+        return 
org.apache.commons.lang3.BooleanUtils.isTrue(nsxSupportsLbService);
+    }
+
     public Map<String, List<String>> getServiceProviders() {
         Map<String, List<String>> serviceProviderMap = new HashMap<>();
         if (serviceProviderList != null && !serviceProviderList.isEmpty() && 
!isForNsx()) {
@@ -213,6 +225,9 @@ public class CreateVPCOfferingCmd extends 
BaseAsyncCreateCmd {
             else
                 serviceProviderMap.put(service, 
List.of(Network.Provider.Nsx.getName()));
         }
+        if (Boolean.FALSE.equals(getNsxSupportsLbService())) {
+            serviceProviderMap.remove(Lb.getName());
+        }
     }
 
     public Map<String, List<String>> getServiceCapabilityList() {
diff --git a/ui/public/locales/en.json b/ui/public/locales/en.json
index a46667f16d2..2513d7bcb41 100644
--- a/ui/public/locales/en.json
+++ b/ui/public/locales/en.json
@@ -1444,6 +1444,7 @@
 "label.nsx.provider.edgecluster": "NSX provider edge cluster",
 "label.nsx.provider.tier0gateway": "NSX provider tier-0 gateway",
 "label.nsx.provider.transportzone": "NSX provider transport zone",
+"label.nsx.supports.lb": "Enable NSX LB service",
 "label.num.cpu.cores": "# of CPU cores",
 "label.number": "#Rule",
 "label.numretries": "Number of retries",
diff --git a/ui/src/views/offering/AddNetworkOffering.vue 
b/ui/src/views/offering/AddNetworkOffering.vue
index 85f88f5b470..a9d8bc529ed 100644
--- a/ui/src/views/offering/AddNetworkOffering.vue
+++ b/ui/src/views/offering/AddNetworkOffering.vue
@@ -129,6 +129,16 @@
             </a-form-item>
           </a-col>
         </a-row>
+        <a-row :gutter="12" v-if="forNsx">
+          <a-col :md="12" :lg="12">
+            <a-form-item name="nsxsupportlb" ref="nsxsupportlb" 
v-if="guestType === 'isolated'">
+              <template #label>
+                <tooltip-label :title="$t('label.nsx.supports.lb')" 
:tooltip="apiParams.nsxsupportlb.description"/>
+              </template>
+              <a-switch v-model:checked="form.nsxsupportlb" @change="val => { 
handleNsxLbService(val) }" />
+            </a-form-item>
+          </a-col>
+        </a-row>
         <a-form-item name="nsxmode" ref="nsxmode" v-if="forNsx">
           <template #label>
             <tooltip-label :title="$t('label.nsxmode')" 
:tooltip="apiParams.nsxmode.description"/>
@@ -633,7 +643,8 @@ export default {
         conservemode: true,
         availability: 'optional',
         egressdefaultpolicy: 'deny',
-        ispublic: this.isPublic
+        ispublic: this.isPublic,
+        nsxsupportlb: true
       })
       this.rules = reactive({
         name: [{ required: true, message: this.$t('message.error.name') }],
@@ -851,6 +862,12 @@ export default {
         supportedServices = supportedServices.filter(svc => {
           return Object.keys(this.nsxSupportedServicesMap).includes(svc.name)
         })
+        supportedServices = supportedServices.map(svc => {
+          if (!['Dhcp', 'Dns', 'UserData'].includes(svc.name)) {
+            svc.provider = [this.NSX]
+          }
+          return svc
+        })
         self.supportedSvcs = self.supportedServices
         self.supportedServices = supportedServices
         self.supportedServiceLoading = false
@@ -889,6 +906,15 @@ export default {
       }
       this.fetchSupportedServiceData()
     },
+    handleNsxLbService (supportLb) {
+      if (!supportLb && 'Lb' in this.nsxSupportedServicesMap) {
+        delete this.nsxSupportedServicesMap.Lb
+      }
+      if (supportLb && !('Lb' in this.nsxSupportedServicesMap)) {
+        this.nsxSupportedServicesMap.Lb = this.NSX
+      }
+      this.fetchSupportedServiceData()
+    },
     handleLbTypeChange (lbType) {
       this.lbType = lbType
       this.updateSupportedServices()
@@ -998,6 +1024,7 @@ export default {
         if (values.fornsx === true) {
           params.fornsx = true
           params.nsxmode = values.nsxmode
+          params.nsxsupportlb = values.nsxsupportlb
         }
         if (values.guestiptype === 'shared' || values.guestiptype === 
'isolated') {
           if (values.conservemode !== true) {
diff --git a/ui/src/views/offering/AddVpcOffering.vue 
b/ui/src/views/offering/AddVpcOffering.vue
index 0da1fceb4f3..99a89895b74 100644
--- a/ui/src/views/offering/AddVpcOffering.vue
+++ b/ui/src/views/offering/AddVpcOffering.vue
@@ -76,6 +76,16 @@
               <a-switch v-model:checked="form.fornsx" @change="val => { 
handleForNsxChange(val) }" />
             </a-form-item>
           </a-col>
+          <!-- <a-row :gutter="1" v-if="forNsx"> -->
+          <a-col :md="12" :lg="12" v-if="forNsx">
+            <a-form-item name="nsxsupportlb" ref="nsxsupportlb">
+              <template #label>
+                <tooltip-label :title="$t('label.nsx.supports.lb')" 
:tooltip="apiParams.nsxsupportlb.description"/>
+              </template>
+              <a-switch v-model:checked="form.nsxsupportlb" @change="val => { 
handleNsxLbService(val) }" />
+            </a-form-item>
+          </a-col>
+        <!-- </a-row> -->
         </a-row>
         <a-form-item name="nsxmode" ref="nsxmode" v-if="forNsx">
           <template #label>
@@ -293,7 +303,8 @@ export default {
         regionlevelvpc: true,
         distributedrouter: true,
         ispublic: true,
-        internetprotocol: this.internetProtocolValue
+        internetprotocol: this.internetProtocolValue,
+        nsxsupportlb: true
       })
       this.rules = reactive({
         name: [{ required: true, message: this.$t('message.error.name') }],
@@ -482,8 +493,24 @@ export default {
     async handleForNsxChange (forNsx) {
       this.forNsx = forNsx
       this.showMode = forNsx
+      if (forNsx) {
+        this.form.nsxsupportlb = true
+        this.handleNsxLbService(true)
+      }
       this.fetchSupportedServiceData()
     },
+    handleNsxLbService (supportLb) {
+      if (!supportLb) {
+        this.supportedServices = this.supportedServices.filter(svc => svc.name 
!== 'Lb')
+      }
+      if (supportLb) {
+        this.supportedServices.push({
+          name: 'Lb',
+          enabled: true,
+          provider: [{ name: 'Nsx' }]
+        })
+      }
+    },
     handleSupportedServiceChange (service, checked, provider) {
       if (service === 'Connectivity') {
         this.connectivityServiceChecked = checked
@@ -561,6 +588,7 @@ export default {
         if (values.fornsx === true) {
           params.fornsx = true
           params.nsxmode = values.nsxmode
+          params.nsxsupportlb = values.nsxsupportlb
         }
         if (this.selectedServiceProviderMap != null) {
           var supportedServices = Object.keys(this.selectedServiceProviderMap)

Reply via email to