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)
