From 7b2be10492099604dc33eacb7b1fe459f217f71c Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Fri, 23 Jan 2026 12:46:09 -0500 Subject: [PATCH] extract common code wrt service capability in network & vpc offering in add/clone operations --- .../composables/useServiceCapabilityParams.js | 153 ++++++++++++++++++ ui/src/views/offering/AddNetworkOffering.vue | 95 +---------- ui/src/views/offering/AddVpcOffering.vue | 31 +--- .../views/offering/CloneNetworkOffering.vue | 149 +++++++---------- ui/src/views/offering/CloneVpcOffering.vue | 39 +---- 5 files changed, 216 insertions(+), 251 deletions(-) create mode 100644 ui/src/composables/useServiceCapabilityParams.js diff --git a/ui/src/composables/useServiceCapabilityParams.js b/ui/src/composables/useServiceCapabilityParams.js new file mode 100644 index 00000000000..734f30ec3f4 --- /dev/null +++ b/ui/src/composables/useServiceCapabilityParams.js @@ -0,0 +1,153 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +export function buildServiceCapabilityParams (params, values, selectedServiceProviderMap, registeredServicePackages) { + const supportedServices = Object.keys(selectedServiceProviderMap) + params.supportedservices = supportedServices.join(',') + for (const k in supportedServices) { + params[`serviceProviderList[${k}].service`] = supportedServices[k] + params[`serviceProviderList[${k}].provider`] = selectedServiceProviderMap[supportedServices[k]] + } + let serviceCapabilityIndex = 0 + if (supportedServices.includes('Connectivity')) { + if (values.supportsstrechedl2subnet === true) { + params[`serviceCapabilityList[${serviceCapabilityIndex}].service`] = 'Connectivity' + params[`serviceCapabilityList[${serviceCapabilityIndex}].capabilitytype`] = 'RegionLevelVpc' + params[`serviceCapabilityList[${serviceCapabilityIndex}].capabilityvalue`] = true + serviceCapabilityIndex++ + } + if (values.supportspublicaccess === true) { + params[`serviceCapabilityList[${serviceCapabilityIndex}].service`] = 'Connectivity' + params[`serviceCapabilityList[${serviceCapabilityIndex}].capabilitytype`] = 'DistributedRouter' + params[`serviceCapabilityList[${serviceCapabilityIndex}].capabilityvalue`] = true + serviceCapabilityIndex++ + } + delete params.supportsstrechedl2subnet + delete params.supportspublicaccess + } + // SourceNat capabilities + if (supportedServices.includes('SourceNat')) { + if (values.redundantroutercapability === true) { + params[`serviceCapabilityList[${serviceCapabilityIndex}].service`] = 'SourceNat' + params[`serviceCapabilityList[${serviceCapabilityIndex}].capabilitytype`] = 'RedundantRouter' + params[`serviceCapabilityList[${serviceCapabilityIndex}].capabilityvalue`] = true + serviceCapabilityIndex++ + } + params[`servicecapabilitylist[${serviceCapabilityIndex}].service`] = 'SourceNat' + params[`servicecapabilitylist[${serviceCapabilityIndex}].capabilitytype`] = 'SupportedSourceNatTypes' + params[`servicecapabilitylist[${serviceCapabilityIndex}].capabilityvalue`] = values.sourcenattype + serviceCapabilityIndex++ + delete params.redundantroutercapability + delete params.sourcenattype + } else if (values.redundantroutercapability === true) { + params[`serviceCapabilityList[${serviceCapabilityIndex}].service`] = 'Gateway' + params[`serviceCapabilityList[${serviceCapabilityIndex}].capabilitytype`] = 'RedundantRouter' + params[`serviceCapabilityList[${serviceCapabilityIndex}].capabilityvalue`] = true + serviceCapabilityIndex++ + } + // StaticNat capabilities + if (supportedServices.includes('SourceNat')) { + if (values.elasticip === true) { + params[`servicecapabilitylist[${serviceCapabilityIndex}].service`] = 'StaticNat' + params[`servicecapabilitylist[${serviceCapabilityIndex}].capabilitytype`] = 'ElasticIp' + params[`servicecapabilitylist[${serviceCapabilityIndex}].capabilityvalue`] = true + serviceCapabilityIndex++ + } + if (values.elasticip === true || values.associatepublicip === true) { + params[`servicecapabilitylist[${serviceCapabilityIndex}].service`] = 'StaticNat' + params[`servicecapabilitylist[${serviceCapabilityIndex}].capabilitytype`] = 'associatePublicIP' + params[`servicecapabilitylist[${serviceCapabilityIndex}].capabilityvalue`] = values.associatepublicip + serviceCapabilityIndex++ + } + delete params.elasticip + delete params.associatepublicip + } + // Lb capabilities + if (supportedServices.includes('Lb')) { + if ('vmautoscalingcapability' in values) { + params[`servicecapabilitylist[${serviceCapabilityIndex}].service`] = 'lb' + params[`servicecapabilitylist[${serviceCapabilityIndex}].capabilitytype`] = 'VmAutoScaling' + params[`servicecapabilitylist[${serviceCapabilityIndex}].capabilityvalue`] = values.vmautoscalingcapability + serviceCapabilityIndex++ + } + if (values.elasticlb === true) { + params[`servicecapabilitylist[${serviceCapabilityIndex}].service`] = 'lb' + params[`servicecapabilitylist[${serviceCapabilityIndex}].capabilitytype`] = 'ElasticLb' + params[`servicecapabilitylist[${serviceCapabilityIndex}].capabilityvalue`] = true + serviceCapabilityIndex++ + } + if (values.inlinemode === true && ((selectedServiceProviderMap.Lb === 'F5BigIp') || (selectedServiceProviderMap.Lb === 'Netscaler'))) { + params[`servicecapabilitylist[${serviceCapabilityIndex}].service`] = 'lb' + params[`servicecapabilitylist[${serviceCapabilityIndex}].capabilitytype`] = 'InlineMode' + params[`servicecapabilitylist[${serviceCapabilityIndex}].capabilityvalue`] = values.inlinemode + serviceCapabilityIndex++ + } + params[`servicecapabilitylist[${serviceCapabilityIndex}].service`] = 'lb' + params[`servicecapabilitylist[${serviceCapabilityIndex}].capabilitytype`] = 'SupportedLbIsolation' + params[`servicecapabilitylist[${serviceCapabilityIndex}].capabilityvalue`] = values.isolation || 'dedicated' + serviceCapabilityIndex++ + if (selectedServiceProviderMap.Lb === 'InternalLbVm') { + params[`servicecapabilitylist[${serviceCapabilityIndex}].service`] = 'lb' + params[`servicecapabilitylist[${serviceCapabilityIndex}].capabilitytype`] = 'lbSchemes' + params[`servicecapabilitylist[${serviceCapabilityIndex}].capabilityvalue`] = 'internal' + serviceCapabilityIndex++ + } + if ('netscalerservicepackages' in values && + registeredServicePackages.length > values.netscalerservicepackages && + 'netscalerservicepackagesdescription' in values) { + params['details[0].servicepackageuuid'] = registeredServicePackages[values.netscalerservicepackages].id + params['details[1].servicepackagedescription'] = values.netscalerservicepackagesdescription + } + } +} + +/** + * Build the VPC service capability params for Add/Clone VPC Offering forms. + * Handles: RegionLevelVpc, DistributedRouter, RedundantRouter (SourceNat/Gateway) + */ +export function buildVpcServiceCapabilityParams (params, values, selectedServiceProviderMap, isVpcVirtualRouterForAtLeastOneService) { + const supportedServices = Object.keys(selectedServiceProviderMap) + let serviceCapabilityIndex = 0 + if (supportedServices.includes('Connectivity')) { + if (values.regionlevelvpc === true) { + params[`serviceCapabilityList[${serviceCapabilityIndex}].service`] = 'Connectivity' + params[`serviceCapabilityList[${serviceCapabilityIndex}].capabilitytype`] = 'RegionLevelVpc' + params[`serviceCapabilityList[${serviceCapabilityIndex}].capabilityvalue`] = true + serviceCapabilityIndex++ + } + if (values.distributedrouter === true) { + params[`serviceCapabilityList[${serviceCapabilityIndex}].service`] = 'Connectivity' + params[`serviceCapabilityList[${serviceCapabilityIndex}].capabilitytype`] = 'DistributedRouter' + params[`serviceCapabilityList[${serviceCapabilityIndex}].capabilityvalue`] = true + serviceCapabilityIndex++ + } + } + if (supportedServices.includes('SourceNat') && values.redundantrouter === true) { + params[`serviceCapabilityList[${serviceCapabilityIndex}].service`] = 'SourceNat' + params[`serviceCapabilityList[${serviceCapabilityIndex}].capabilitytype`] = 'RedundantRouter' + params[`serviceCapabilityList[${serviceCapabilityIndex}].capabilityvalue`] = true + serviceCapabilityIndex++ + } else if (values.redundantrouter === true) { + params[`serviceCapabilityList[${serviceCapabilityIndex}].service`] = 'Gateway' + params[`serviceCapabilityList[${serviceCapabilityIndex}].capabilitytype`] = 'RedundantRouter' + params[`serviceCapabilityList[${serviceCapabilityIndex}].capabilityvalue`] = true + serviceCapabilityIndex++ + } + if (values.serviceofferingid && isVpcVirtualRouterForAtLeastOneService) { + params.serviceofferingid = values.serviceofferingid + } +} diff --git a/ui/src/views/offering/AddNetworkOffering.vue b/ui/src/views/offering/AddNetworkOffering.vue index abb70abda27..d1bbb0f7304 100644 --- a/ui/src/views/offering/AddNetworkOffering.vue +++ b/ui/src/views/offering/AddNetworkOffering.vue @@ -588,6 +588,7 @@ import { mixinForm } from '@/utils/mixin' import CheckBoxSelectPair from '@/components/CheckBoxSelectPair' import ResourceIcon from '@/components/view/ResourceIcon' import TooltipLabel from '@/components/widgets/TooltipLabel' +import { buildServiceCapabilityParams } from '@/composables/useServiceCapabilityParams' export default { name: 'AddNetworkOffering', @@ -1173,99 +1174,7 @@ export default { } } if (this.selectedServiceProviderMap != null) { - var supportedServices = Object.keys(this.selectedServiceProviderMap) - params.supportedservices = supportedServices.join(',') - for (var k in supportedServices) { - params['serviceProviderList[' + k + '].service'] = supportedServices[k] - params['serviceProviderList[' + k + '].provider'] = this.selectedServiceProviderMap[supportedServices[k]] - } - var serviceCapabilityIndex = 0 - if (supportedServices.includes('Connectivity')) { - if (values.supportsstrechedl2subnet === true) { - params['serviceCapabilityList[' + serviceCapabilityIndex + '].service'] = 'Connectivity' - params['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilitytype'] = 'RegionLevelVpc' - params['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilityvalue'] = true - serviceCapabilityIndex++ - } - if (values.supportspublicaccess === true) { - params['serviceCapabilityList[' + serviceCapabilityIndex + '].service'] = 'Connectivity' - params['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilitytype'] = 'DistributedRouter' - params['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilityvalue'] = true - serviceCapabilityIndex++ - } - delete params.supportsstrechedl2subnet - delete params.supportspublicaccess - } - if (supportedServices.includes('SourceNat')) { - if (values.redundantroutercapability === true) { - params['serviceCapabilityList[' + serviceCapabilityIndex + '].service'] = 'SourceNat' - params['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilitytype'] = 'RedundantRouter' - params['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilityvalue'] = true - serviceCapabilityIndex++ - } - params['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'SourceNat' - params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'SupportedSourceNatTypes' - params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = values.sourcenattype - serviceCapabilityIndex++ - delete params.redundantroutercapability - delete params.sourcenattype - } else if (values.redundantroutercapability === true) { - params['serviceCapabilityList[' + serviceCapabilityIndex + '].service'] = 'Gateway' - params['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilitytype'] = 'RedundantRouter' - params['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilityvalue'] = true - } - if (supportedServices.includes('SourceNat')) { - if (values.elasticip === true) { - params['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'StaticNat' - params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'ElasticIp' - params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = true - serviceCapabilityIndex++ - } - if (values.elasticip === true || values.associatepublicip === true) { - params['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'StaticNat' - params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'associatePublicIP' - params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = values.associatepublicip - serviceCapabilityIndex++ - } - delete params.elasticip - delete params.associatepublicip - } - if (supportedServices.includes('Lb')) { - if ('vmautoscalingcapability' in values) { - params['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'lb' - params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'VmAutoScaling' - params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = values.vmautoscalingcapability - serviceCapabilityIndex++ - } - if (values.elasticlb === true) { - params['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'lb' - params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'ElasticLb' - params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = true - serviceCapabilityIndex++ - } - if (values.inlinemode === true && ((this.selectedServiceProviderMap.Lb === 'F5BigIp') || (this.selectedServiceProviderMap.Lb === 'Netscaler'))) { - params['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'lb' - params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'InlineMode' - params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = values.inlinemode - serviceCapabilityIndex++ - } - params['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'lb' - params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'SupportedLbIsolation' - params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = values.isolation - serviceCapabilityIndex++ - if (this.selectedServiceProviderMap.Lb === 'InternalLbVm') { - params['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'lb' - params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'lbSchemes' - params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = 'internal' - serviceCapabilityIndex++ - } - if ('netscalerservicepackages' in values && - this.registeredServicePackages.length > values.netscalerservicepackages && - 'netscalerservicepackagesdescription' in values) { - params['details[' + 0 + '].servicepackageuuid'] = this.registeredServicePackages[values.netscalerservicepackages].id - params['details[' + 1 + '].servicepackagedescription'] = values.netscalerservicepackagesdescription - } - } + buildServiceCapabilityParams(params, values, this.selectedServiceProviderMap, this.registeredServicePackages) } else { if (!('supportedservices' in params)) { params.supportedservices = '' diff --git a/ui/src/views/offering/AddVpcOffering.vue b/ui/src/views/offering/AddVpcOffering.vue index 32aa3e8d358..b69e5ae8de8 100644 --- a/ui/src/views/offering/AddVpcOffering.vue +++ b/ui/src/views/offering/AddVpcOffering.vue @@ -269,6 +269,7 @@ import { mixinForm } from '@/utils/mixin' import CheckBoxSelectPair from '@/components/CheckBoxSelectPair' import ResourceIcon from '@/components/view/ResourceIcon' import TooltipLabel from '@/components/widgets/TooltipLabel' +import { buildVpcServiceCapabilityParams } from '@/composables/useServiceCapabilityParams' export default { name: 'AddVpcOffering', @@ -733,35 +734,7 @@ export default { params['serviceProviderList[' + k + '].service'] = supportedServices[k] params['serviceProviderList[' + k + '].provider'] = this.selectedServiceProviderMap[supportedServices[k]] } - var serviceCapabilityIndex = 0 - if (supportedServices.includes('Connectivity')) { - if (values.regionlevelvpc === true) { - params['serviceCapabilityList[' + serviceCapabilityIndex + '].service'] = 'Connectivity' - params['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilitytype'] = 'RegionLevelVpc' - params['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilityvalue'] = true - serviceCapabilityIndex++ - } - if (values.distributedrouter === true) { - params['serviceCapabilityList[' + serviceCapabilityIndex + '].service'] = 'Connectivity' - params['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilitytype'] = 'DistributedRouter' - params['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilityvalue'] = true - serviceCapabilityIndex++ - } - } - if (supportedServices.includes('SourceNat') && values.redundantrouter === true) { - params['serviceCapabilityList[' + serviceCapabilityIndex + '].service'] = 'SourceNat' - params['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilitytype'] = 'RedundantRouter' - params['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilityvalue'] = true - serviceCapabilityIndex++ - } else if (values.redundantrouter === true) { - params['serviceCapabilityList[' + serviceCapabilityIndex + '].service'] = 'Gateway' - params['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilitytype'] = 'RedundantRouter' - params['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilityvalue'] = true - serviceCapabilityIndex++ - } - if (values.serviceofferingid && this.isVpcVirtualRouterForAtLeastOneService) { - params.serviceofferingid = values.serviceofferingid - } + buildVpcServiceCapabilityParams(params, values, this.selectedServiceProviderMap, this.isVpcVirtualRouterForAtLeastOneService) } else { params.supportedservices = [] } diff --git a/ui/src/views/offering/CloneNetworkOffering.vue b/ui/src/views/offering/CloneNetworkOffering.vue index 1bd9c63aebe..0cd5e733b24 100644 --- a/ui/src/views/offering/CloneNetworkOffering.vue +++ b/ui/src/views/offering/CloneNetworkOffering.vue @@ -324,7 +324,8 @@ + buttonStyle="solid" + @change="e => { handleLbTypeChange(e.target.value) }" > {{ $t('label.public.lb') }} @@ -579,6 +580,7 @@ import ResourceIcon from '@/components/view/ResourceIcon' import TooltipLabel from '@/components/widgets/TooltipLabel' import CheckBoxSelectPair from '@/components/CheckBoxSelectPair' import { BlockOutlined, GlobalOutlined } from '@ant-design/icons-vue' +import { buildServiceCapabilityParams } from '@/composables/useServiceCapabilityParams' export default { name: 'CloneNetworkOffering', @@ -792,6 +794,46 @@ export default { this.supportedServiceLoading = false }) }, + handleLbTypeChange (lbType) { + this.lbType = lbType + // Enable InternalLbVm provider for Lb service if internalLb is selected + if (lbType === 'internalLb') { + this.supportedServices = this.supportedServices.map(svc => { + if (svc.name === 'Lb') { + const providers = svc.provider.map(provider => { + provider.enabled = provider.name === 'InternalLbVm' + this.lbServiceProvider = provider + return provider + }) + return { ...svc, provider: providers, defaultChecked: true, selectedProvider: 'InternalLbVm' } + } + return svc + }) + this.selectedServiceProviderMap.Lb = 'InternalLbVm' + } else { + // Revert to default providers for Lb service + this.supportedServices = this.supportedServices.map(svc => { + if (svc.name === 'Lb') { + const providers = svc.provider.map(provider => { + provider.enabled = provider.name !== 'InternalLbVm' + return provider + }) + // Pick the first enabled provider as selected + const firstEnabled = providers.find(p => p.enabled) + return { ...svc, provider: providers, defaultChecked: !!firstEnabled, selectedProvider: firstEnabled ? firstEnabled.name : null } + } + return svc + }) + // Update selectedServiceProviderMap for Lb + const lbSvc = this.supportedServices.find(svc => svc.name === 'Lb') + if (lbSvc && lbSvc.selectedProvider) { + this.selectedServiceProviderMap.Lb = lbSvc.selectedProvider + } else { + delete this.selectedServiceProviderMap.Lb + } + } + this.updateSupportedServices() + }, populateFormFromResource () { if (!this.resource) return @@ -871,6 +913,10 @@ export default { this.form.networkmode = r.networkmode } + if (r.supportsinternallb) { + this.form.lbtype = 'internalLb' + } + if (r.availability) { const isIsolatedWithSourceNat = this.guestType === 'isolated' && r.service && @@ -973,6 +1019,9 @@ export default { const providers = svc.provider.map(provider => { if (this.forVpc) { const enabledProviders = ['VpcVirtualRouter', 'Netscaler', 'BigSwitchBcf', 'ConfigDrive'] + if (self.lbType === 'internalLb') { + enabledProviders.push('InternalLbVm') + } provider.enabled = enabledProviders.includes(provider.name) } else { provider.enabled = !['InternalLbVm', 'VpcVirtualRouter', 'Nsx', 'Netris'].includes(provider.name) @@ -1245,100 +1294,12 @@ export default { params.guestiptype = values.guestiptype } - // MUST send supportedservices explicitly for ALL providers (including NSX/Netris) - // because backend's cloneNetworkOffering copies services from source offering if not provided - // When network mode changes, we need to send the updated service list + // Use composable for service capability params if (this.selectedServiceProviderMap != null) { - const supportedServices = Object.keys(this.selectedServiceProviderMap) - params.supportedservices = supportedServices.join(',') - for (const k in supportedServices) { - params['serviceProviderList[' + k + '].service'] = supportedServices[k] - params['serviceProviderList[' + k + '].provider'] = this.selectedServiceProviderMap[supportedServices[k]] - } - - let serviceCapabilityIndex = 0 - - if (supportedServices.includes('Connectivity')) { - if (values.supportsstrechedl2subnet === true) { - params['serviceCapabilityList[' + serviceCapabilityIndex + '].service'] = 'Connectivity' - params['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilitytype'] = 'RegionLevelVpc' - params['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilityvalue'] = true - serviceCapabilityIndex++ - } - } - - if (supportedServices.includes('SourceNat')) { - if (values.redundantroutercapability === true) { - params['serviceCapabilityList[' + serviceCapabilityIndex + '].service'] = 'SourceNat' - params['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilitytype'] = 'RedundantRouter' - params['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilityvalue'] = true - serviceCapabilityIndex++ - } - params['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'SourceNat' - params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'SupportedSourceNatTypes' - params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = values.sourcenattype - serviceCapabilityIndex++ - } else if (values.redundantroutercapability === true) { - params['serviceCapabilityList[' + serviceCapabilityIndex + '].service'] = 'Gateway' - params['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilitytype'] = 'RedundantRouter' - params['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilityvalue'] = true - serviceCapabilityIndex++ - } - - if (supportedServices.includes('SourceNat')) { - if (values.elasticip === true) { - params['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'StaticNat' - params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'ElasticIp' - params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = true - serviceCapabilityIndex++ - } - if (values.elasticip === true || values.associatepublicip === true) { - params['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'StaticNat' - params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'associatePublicIP' - params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = values.associatepublicip - serviceCapabilityIndex++ - } - } - - if (supportedServices.includes('Lb')) { - if ('vmautoscalingcapability' in values) { - params['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'lb' - params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'VmAutoScaling' - params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = values.vmautoscalingcapability - serviceCapabilityIndex++ - } - if (values.elasticlb === true) { - params['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'lb' - params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'ElasticLb' - params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = true - serviceCapabilityIndex++ - } - if (values.inlinemode === 'true' && ((this.selectedServiceProviderMap.Lb === 'F5BigIp') || (this.selectedServiceProviderMap.Lb === 'Netscaler'))) { - params['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'lb' - params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'InlineMode' - params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = values.inlinemode - serviceCapabilityIndex++ - } - - params['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'lb' - params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'SupportedLbIsolation' - params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = values.isolation || 'dedicated' - serviceCapabilityIndex++ - - if (this.selectedServiceProviderMap.Lb === 'InternalLbVm') { - params['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'lb' - params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'lbSchemes' - params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = 'internal' - serviceCapabilityIndex++ - } - - if ('netscalerservicepackages' in values && - values.netscalerservicepackages !== null && - this.registeredServicePackages.length > values.netscalerservicepackages && - 'netscalerservicepackagesdescription' in values) { - params['details[0].servicepackageuuid'] = this.registeredServicePackages[values.netscalerservicepackages].id - params['details[1].servicepackagedescription'] = values.netscalerservicepackagesdescription - } + buildServiceCapabilityParams(params, values, this.selectedServiceProviderMap, this.registeredServicePackages) + } else { + if (!('supportedservices' in params)) { + params.supportedservices = '' } } diff --git a/ui/src/views/offering/CloneVpcOffering.vue b/ui/src/views/offering/CloneVpcOffering.vue index 7e074ad2832..cecc0c600b5 100644 --- a/ui/src/views/offering/CloneVpcOffering.vue +++ b/ui/src/views/offering/CloneVpcOffering.vue @@ -92,6 +92,7 @@ v-model:value="form.provider" @change="val => handleProviderChange(val)" showSearch + disabled optionFilterProp="label" :filterOption="(input, option) => { return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0 @@ -129,6 +130,7 @@