NE: UI cleanup

This commit is contained in:
Wei Zhou 2026-04-16 19:03:34 +02:00
parent eb300ca1e7
commit cc3049d91d
5 changed files with 5 additions and 139 deletions

View File

@ -1096,6 +1096,7 @@
"label.external.details.tooltip": "Details that will be passed to the external provisioner while deploying an instance",
"label.externalprovisioner": "External provisioner",
"label.external.link": "External link",
"label.external.network.provider": "External Network Provider",
"label.externalid": "External Id",
"label.externalloadbalanceripaddress": "External load balancer IP address.",
"label.extra": "Extra arguments",
@ -4241,21 +4242,5 @@
"Compute*Month": "Compute * Month",
"GB*Month": "GB * Month",
"IP*Month": "IP * Month",
"Policy*Month": "Policy * Month",
"ExternalNetwork": "External Network",
"label.external.network": "External Network",
"label.external.network.provider": "External Network Provider",
"label.extension": "Extension",
"label.services": "Services",
"label.add.external.network.provider": "Add External Network Provider",
"label.not.added": "Not Added",
"label.refresh": "Refresh",
"label.run.action": "Run Action",
"label.enable.provider": "Enable Provider",
"label.disable.provider": "Disable Provider",
"label.external.network.service": "External Network Service",
"message.confirm.disable.external.network.provider": "Are you sure you want to disable the External Network provider?",
"message.no.network.orchestrator.extensions": "No NetworkOrchestrator extensions found. Please create one first via createExtension API.",
"message.extension.services.from.capabilities": "Services are derived automatically from the extension's network.service.capabilities detail.",
"message.select.extension": "Please select an extension."
"Policy*Month": "Policy * Month"
}

View File

@ -218,7 +218,7 @@ export default {
{
api: 'runCustomAction',
icon: 'thunderbolt-outlined',
label: 'label.run.action',
label: 'label.run.custom.action',
dataView: true,
show: (record) => {
return 'runCustomAction' in store.getters.apis &&

View File

@ -18,16 +18,6 @@
<template>
<div>
<a-spin :spinning="fetchLoading">
<!-- Add Extension Provider button: only shown when extension is registered but NSP not yet created -->
<a-button
v-if="isExtensionTab && !nsps[tabKey]"
:disabled="!('addNetworkServiceProvider' in $store.getters.apis)"
type="dashed"
style="width: 100%; margin-bottom: 12px;"
@click="handleAddExternalNetworkProvider">
<template #icon><plus-outlined /></template>
{{ $t('label.add.external.network.provider') }}
</a-button>
<a-tabs
:tabPosition="device === 'mobile' ? 'top' : 'left'"
:animated="false"
@ -75,44 +65,6 @@
</a-tabs>
</a-spin>
<!-- Add External Network Provider modal: selects extension (services come from extension capabilities) -->
<a-modal
:visible="showAddExtNetProviderModal"
:title="$t('label.add.external.network.provider')"
:maskClosable="false"
:footer="null"
@cancel="showAddExtNetProviderModal = false">
<a-spin :spinning="extensionProviderLoading">
<a-form layout="vertical">
<a-form-item :label="$t('label.extension')">
<a-select
v-model:value="extNetProviderForm.extensionId"
showSearch
optionFilterProp="label"
:filterOption="(input, option) => option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0">
<a-select-option
v-for="ext in availableExtensions"
:key="ext.id"
:value="ext.id"
:label="ext.name">
{{ ext.name }} <span style="color: #aaa">({{ ext.state }})</span>
</a-select-option>
</a-select>
<div v-if="availableExtensions.length === 0" style="color: #faad14; margin-top: 4px;">
{{ $t('message.no.network.orchestrator.extensions') }}
</div>
<div v-else style="color: #8c8c8c; font-size: 12px; margin-top: 4px;">
{{ $t('message.extension.services.from.capabilities') }}
</div>
</a-form-item>
<div class="action-button">
<a-button @click="showAddExtNetProviderModal = false">{{ $t('label.cancel') }}</a-button>
<a-button type="primary" :disabled="!extNetProviderForm.extensionId" @click="handleAddExtNetProvider">{{ $t('label.ok') }}</a-button>
</div>
</a-form>
</a-spin>
</a-modal>
<div v-if="showFormAction">
<keep-alive v-if="currentAction.component">
<a-modal
@ -241,12 +193,6 @@ export default {
showFormAction: false,
currentAction: {},
tabKey: 'BaremetalDhcpProvider',
showAddExtNetProviderModal: false,
extensionProviderLoading: false,
availableExtensions: [],
extNetProviderForm: {
extensionId: null
},
registeredExtensions: []
}
},
@ -1223,56 +1169,9 @@ export default {
this.form = reactive({})
this.rules = reactive({})
},
handleAddExternalNetworkProvider () {
// Open the extension picker modal services come from extension capabilities
this.extNetProviderForm = { extensionId: null }
this.extensionProviderLoading = true
this.showAddExtNetProviderModal = true
getAPI('listExtensions', { type: 'NetworkOrchestrator' }).then(json => {
this.availableExtensions = (json.listextensionsresponse && json.listextensionsresponse.extension) || []
if (this.availableExtensions.length > 0) {
this.extNetProviderForm.extensionId = this.availableExtensions[0].id
}
}).catch(error => {
this.$notifyError(error)
}).finally(() => {
this.extensionProviderLoading = false
})
},
_updateServicesFromExtension (extensionId) {
// No longer needed services are derived from extension capabilities server-side
},
async handleAddExtNetProvider () {
if (this.extensionProviderLoading) return
const extensionId = this.extNetProviderForm.extensionId
if (!extensionId) {
this.$message.error(this.$t('message.select.extension'))
return
}
const ext = this.availableExtensions.find(e => e.id === extensionId)
const extName = ext ? ext.name : ''
if (!extName) {
this.$message.error(this.$t('message.select.extension'))
return
}
this.extensionProviderLoading = true
try {
// registerExtension auto-creates the NSP (Enabled) with services from network.service.capabilities
await postAPI('registerExtension', {
extensionid: extensionId,
resourceid: this.resource.id,
resourcetype: 'PhysicalNetwork'
})
this.$message.success(this.$t('label.add.external.network.provider') + ': ' + extName)
this.showAddExtNetProviderModal = false
this.fetchData()
} catch (error) {
this.$notifyError(error)
} finally {
this.extensionProviderLoading = false
}
},
fetchData () {
if (!this.resource || !('id' in this.resource)) {
return

View File

@ -138,15 +138,6 @@
<a-select-option key="" >{{ }}</a-select-option>
<a-select-option :value="'NSX'" :label="$t('label.nsx')"> {{ $t('label.nsx') }} </a-select-option>
<a-select-option :value="'Netris'" :label="$t('label.netris')"> {{ $t('label.netris') }} </a-select-option>
<!-- Dynamic extension-based providers registered to guest physical networks.
The value is the extension/NSP name so the provider is correctly resolved. -->
<a-select-option
v-for="ext in availableExtensionProviders"
:key="ext.name"
:value="ext.name"
:label="ext.name">
{{ ext.name }} <span style="color: #aaa">({{ $t('label.external.network.provider') }})</span>
</a-select-option>
</a-select>
</a-form-item>
</a-col>

View File

@ -86,15 +86,6 @@
<a-select-option key="" >{{ }}</a-select-option>
<a-select-option :value="'NSX'" :label="$t('label.nsx')"> {{ $t('label.nsx') }} </a-select-option>
<a-select-option :value="'Netris'" :label="$t('label.netris')"> {{ $t('label.netris') }} </a-select-option>
<!-- Dynamic extension-based providers registered to guest physical networks.
The value is the extension/NSP name for correct provider resolution. -->
<a-select-option
v-for="ext in availableExtensionProviders"
:key="ext.name"
:value="ext.name"
:label="ext.name">
{{ ext.name }} <span style="color: #aaa">({{ $t('label.external.network.provider') }})</span>
</a-select-option>
</a-select>
</a-form-item>
</a-col>
@ -161,8 +152,8 @@
<CheckBoxSelectPair
:resourceKey="item.name"
:checkBoxLabel="item.description"
:forExternalNetProvider="form.provider === 'NSX' || form.provider === 'Netris' || isExternalNetworkProvider"
:defaultCheckBoxValue="form.provider === 'NSX' || form.provider === 'Netris' || isExternalNetworkProvider"
:forExternalNetProvider="form.provider === 'NSX' || form.provider === 'Netris'"
:defaultCheckBoxValue="form.provider === 'NSX' || form.provider === 'Netris'"
:selectOptions="item.provider"
@handle-checkselectpair-change="handleSupportedServiceChange"/>
</a-list-item>