|
160 | 160 | <CheckBoxSelectPair |
161 | 161 | :resourceKey="item.name" |
162 | 162 | :checkBoxLabel="item.description" |
163 | | - :forExternalNetProvider="form.provider === 'NSX' || form.provider === 'Netris'" |
164 | | - :defaultCheckBoxValue="form.provider === 'NSX' || form.provider === 'Netris'" |
| 163 | + :forExternalNetProvider="form.provider === 'NSX' || form.provider === 'Netris' || isExternalNetworkProvider" |
| 164 | + :defaultCheckBoxValue="form.provider === 'NSX' || form.provider === 'Netris' || isExternalNetworkProvider" |
165 | 165 | :selectOptions="item.provider" |
166 | 166 | @handle-checkselectpair-change="handleSupportedServiceChange"/> |
167 | 167 | </a-list-item> |
@@ -336,13 +336,20 @@ export default { |
336 | 336 | description: 'Netris', |
337 | 337 | enabled: true |
338 | 338 | }, |
| 339 | + externalNetworkProviderObj: { |
| 340 | + name: '', |
| 341 | + description: 'External Network', |
| 342 | + enabled: true |
| 343 | + }, |
| 344 | + externalNetworkSupportedServicesMap: {}, |
339 | 345 | nsxSupportedServicesMap: {}, |
340 | 346 | availableExtensionProviders: [] |
341 | 347 | } |
342 | 348 | }, |
343 | 349 | computed: { |
344 | 350 | isExternalNetworkProvider () { |
345 | | - return this.availableExtensionProviders.some(e => e.name === this.provider) |
| 351 | + const selectedProvider = this.form?.provider || this.provider |
| 352 | + return this.availableExtensionProviders.some(e => e.name === selectedProvider) |
346 | 353 | } |
347 | 354 | }, |
348 | 355 | beforeCreate () { |
@@ -457,7 +464,18 @@ export default { |
457 | 464 | }, |
458 | 465 | fetchSupportedServiceData () { |
459 | 466 | var services = [] |
460 | | - if (this.provider === 'NSX') { |
| 467 | + if (this.isExternalNetworkProvider) { |
| 468 | + const serviceMap = this._buildExternalVpcServiceMap() |
| 469 | + Object.keys(serviceMap).forEach(serviceName => { |
| 470 | + services.push({ |
| 471 | + name: serviceName, |
| 472 | + enabled: true, |
| 473 | + provider: Array.isArray(serviceMap[serviceName]) |
| 474 | + ? serviceMap[serviceName] |
| 475 | + : [serviceMap[serviceName]] |
| 476 | + }) |
| 477 | + }) |
| 478 | + } else if (this.provider === 'NSX') { |
461 | 479 | services.push({ |
462 | 480 | name: 'Dhcp', |
463 | 481 | enabled: true, |
@@ -648,9 +666,76 @@ export default { |
648 | 666 | if (this.provider === 'NSX') { |
649 | 667 | this.form.nsxsupportlb = true |
650 | 668 | this.handleNsxLbService(true) |
| 669 | + } else if (this.isExternalNetworkProvider) { |
| 670 | + this._buildExternalVpcServiceMap() |
651 | 671 | } |
652 | 672 | this.fetchSupportedServiceData() |
653 | 673 | }, |
| 674 | + _getExtensionServices (extDef) { |
| 675 | + if (!extDef || !extDef.details) { |
| 676 | + return [] |
| 677 | + } |
| 678 | +
|
| 679 | + const capsJson = extDef.details['network.capabilities'] |
| 680 | + if (capsJson) { |
| 681 | + try { |
| 682 | + const caps = JSON.parse(capsJson) |
| 683 | + if (caps && Array.isArray(caps.services)) { |
| 684 | + return caps.services |
| 685 | + } |
| 686 | + } catch (e) { |
| 687 | + // Ignore malformed capabilities and fallback to network.services. |
| 688 | + } |
| 689 | + } |
| 690 | +
|
| 691 | + const servicesCsv = extDef.details['network.services'] |
| 692 | + if (servicesCsv && typeof servicesCsv === 'string') { |
| 693 | + return servicesCsv.split(',').map(x => x.trim()).filter(x => x.length > 0) |
| 694 | + } |
| 695 | + return [] |
| 696 | + }, |
| 697 | + _buildExternalVpcServiceMap () { |
| 698 | + const selectedProvider = this.form?.provider || this.provider |
| 699 | + const extProviderObj = { |
| 700 | + name: selectedProvider, |
| 701 | + description: selectedProvider, |
| 702 | + enabled: true |
| 703 | + } |
| 704 | + const extWithFallbackProviders = [ |
| 705 | + { name: selectedProvider }, |
| 706 | + { name: 'VpcVirtualRouter' }, |
| 707 | + { name: 'ConfigDrive' } |
| 708 | + ] |
| 709 | + const serviceMap = { |
| 710 | + Dhcp: extWithFallbackProviders, |
| 711 | + Dns: extWithFallbackProviders, |
| 712 | + UserData: extWithFallbackProviders |
| 713 | + } |
| 714 | +
|
| 715 | + const extDef = this.availableExtensionProviders.find(e => e.name === selectedProvider) |
| 716 | + const services = this._getExtensionServices(extDef) |
| 717 | + const allowedVpcServices = new Set([ |
| 718 | + 'Gateway', 'Lb', 'StaticNat', 'SourceNat', 'NetworkACL', 'PortForwarding', 'Vpn' |
| 719 | + ]) |
| 720 | +
|
| 721 | + services.forEach(service => { |
| 722 | + if (allowedVpcServices.has(service)) { |
| 723 | + serviceMap[service] = [{ name: selectedProvider }] |
| 724 | + } |
| 725 | + }) |
| 726 | +
|
| 727 | + // Fallback for older extensions that only declare partial details. |
| 728 | + if (Object.keys(serviceMap).length <= 3) { |
| 729 | + serviceMap.SourceNat = [{ name: selectedProvider }] |
| 730 | + serviceMap.StaticNat = [{ name: selectedProvider }] |
| 731 | + serviceMap.PortForwarding = [{ name: selectedProvider }] |
| 732 | + serviceMap.NetworkACL = [{ name: selectedProvider }] |
| 733 | + } |
| 734 | +
|
| 735 | + this.externalNetworkProviderObj = extProviderObj |
| 736 | + this.externalNetworkSupportedServicesMap = serviceMap |
| 737 | + return serviceMap |
| 738 | + }, |
654 | 739 | handleNsxLbService (supportLb) { |
655 | 740 | console.log(supportLb) |
656 | 741 | if (!supportLb) { |
|
0 commit comments