实例VNIC:附加后自动刷新、IPv6限挂载态与脚注修正

This commit is contained in:
2026-07-16 12:32:20 +08:00
parent 78cc2aab56
commit 6a7757ae2f
+19 -5
View File
@@ -27,9 +27,15 @@ const emit = defineEmits<{ changed: [] }>()
const message = useToast() const message = useToast()
const vnics = useAsync(() => listVnics(props.cfgId, props.instanceId, props.region)) const vnics = useAsync(() => listVnics(props.cfgId, props.instanceId, props.region))
/** 附加已受理但 OCI 挂载列表有可见性延迟:限时轮询等新卡入列,入列后交由过渡态轮询接管 */
const expectAtLeast = ref(0)
let expectUntil = 0
useTransientPoll( useTransientPoll(
() => vnics.data.value, () => vnics.data.value,
(list) => !!list?.some((v) => ATTACHMENT_TRANSIENT_STATES.includes(v.lifecycleState)), (list) =>
!!list?.some((v) => ATTACHMENT_TRANSIENT_STATES.includes(v.lifecycleState)) ||
((list?.length ?? 0) < expectAtLeast.value && Date.now() < expectUntil),
() => void vnics.run({ silent: true }), () => void vnics.run({ silent: true }),
) )
@@ -44,6 +50,12 @@ function refresh() {
emit('changed') emit('changed')
} }
function onAttached() {
expectAtLeast.value = (vnics.data.value ?? []).length + 1
expectUntil = Date.now() + 90_000
refresh()
}
async function doDetach(attachmentId: string) { async function doDetach(attachmentId: string) {
detaching.value = attachmentId detaching.value = attachmentId
try { try {
@@ -174,7 +186,7 @@ defineExpose({ refresh: () => vnics.run() })
<td colspan="6" class="px-4.5 pt-0 pb-2.5"> <td colspan="6" class="px-4.5 pt-0 pb-2.5">
<div class="flex flex-wrap items-center gap-1.5"> <div class="flex flex-wrap items-center gap-1.5">
<span class="text-[10.5px] font-medium tracking-wider text-ink-3">IPV6</span> <span class="text-[10.5px] font-medium tracking-wider text-ink-3">IPV6</span>
<template v-if="v.vnicId"> <template v-if="v.vnicId && v.lifecycleState === 'ATTACHED'">
<span <span
v-for="addr in v.ipv6Addresses ?? []" v-for="addr in v.ipv6Addresses ?? []"
:key="addr" :key="addr"
@@ -204,7 +216,9 @@ defineExpose({ refresh: () => vnics.run() })
+ IPv6 + IPv6
</NButton> </NButton>
</template> </template>
<span v-else class="text-xs text-ink-3"> · 附加完成后可添加</span> <span v-else class="text-xs text-ink-3">
{{ v.vnicId ? '网卡未在挂载状态,不可操作 IPv6' : '无 · 附加完成后可添加' }}
</span>
</div> </div>
</td> </td>
</tr> </tr>
@@ -221,7 +235,7 @@ defineExpose({ refresh: () => vnics.run() })
<FootNote> <FootNote>
附加须实例运行中且 shape 有空余 VNIC 配额 · 主网卡不可分离 · 每卡 IPv6 附加须实例运行中且 shape 有空余 VNIC 配额 · 主网卡不可分离 · 每卡 IPv6
可多个要求所在子网已启用 IPv6· 次要网卡在 OS 内需自行配置 IPdhclient / netplan 可多个要求所在子网已启用 IPv6
</FootNote> </FootNote>
<AttachVnicModal <AttachVnicModal
@@ -230,7 +244,7 @@ defineExpose({ refresh: () => vnics.run() })
:instance-id="instanceId" :instance-id="instanceId"
:region="region" :region="region"
:attached-count="(vnics.data.value ?? []).length" :attached-count="(vnics.data.value ?? []).length"
@attached="refresh" @attached="onAttached"
/> />
</div> </div>
</template> </template>