From 5c3c89c78a9b0601652eacd6971df7dfcb5825cd Mon Sep 17 00:00:00 2001 From: xusongfu Date: Thu, 25 Nov 2021 15:26:57 +0800 Subject: [PATCH] fix: Show VGPU info if architecture is heterogeneous_computing Use placement service to get VGPU infomation Change-Id: Ib6d8b77f562369f69e9a6aa937abde5ef7099cce --- src/client/placement/index.js | 3 +++ src/locales/zh.json | 2 +- .../Hypervisors/Hypervisor/Detail/index.jsx | 11 +++++++- .../Instance/Detail/BaseDetail/index.jsx | 21 ++++++++++++---- src/stores/nova/hypervisor.js | 25 +++++++++++++++++-- 5 files changed, 53 insertions(+), 9 deletions(-) diff --git a/src/client/placement/index.js b/src/client/placement/index.js index 7e522830..5bdce1d0 100644 --- a/src/client/placement/index.js +++ b/src/client/placement/index.js @@ -29,6 +29,9 @@ class PlacementClient extends Base { { key: 'inventories', }, + { + key: 'usages', + }, ], }, { diff --git a/src/locales/zh.json b/src/locales/zh.json index e1fdb87e..6583b4c9 100644 --- a/src/locales/zh.json +++ b/src/locales/zh.json @@ -811,7 +811,7 @@ "ICMP Code": "ICMP编码", "ICMP Type": "ICMP类型", "ICMP Type/ICMP Code": "类型值/编码值", - "ID": "印度尼西亚", + "ID": "ID", "ID/Floating IP": "ID/浮动IP", "ID/Name": "ID/名称", "IGMP": "", diff --git a/src/pages/compute/containers/Hypervisors/Hypervisor/Detail/index.jsx b/src/pages/compute/containers/Hypervisors/Hypervisor/Detail/index.jsx index f433878e..dd755f1f 100644 --- a/src/pages/compute/containers/Hypervisors/Hypervisor/Detail/index.jsx +++ b/src/pages/compute/containers/Hypervisors/Hypervisor/Detail/index.jsx @@ -33,7 +33,7 @@ export class HypervisorDetail extends Base { } get detailInfos() { - return [ + const info = [ { title: t('Hostname'), dataIndex: 'hypervisor_hostname', @@ -71,6 +71,15 @@ export class HypervisorDetail extends Base { ), }, ]; + const { vgpus, vgpus_used } = this.store.detail; + if (vgpus) { + info.push({ + title: t('VGPU (Core)'), + dataIndex: 'vgpus', + render: () => `${vgpus_used} / ${vgpus}`, + }); + } + return info; } get tabs() { diff --git a/src/pages/compute/containers/Instance/Detail/BaseDetail/index.jsx b/src/pages/compute/containers/Instance/Detail/BaseDetail/index.jsx index c3ed4879..c87114dd 100644 --- a/src/pages/compute/containers/Instance/Detail/BaseDetail/index.jsx +++ b/src/pages/compute/containers/Instance/Detail/BaseDetail/index.jsx @@ -118,25 +118,36 @@ export class BaseDetail extends Base { } get flavorCard() { - const privateFlavors = toJS(this.detailData.flavor) || []; + const flavor = toJS(this.detailData.flavor) || {}; + const { extra_specs = {} } = flavor; const options = [ { label: t('Flavor Name'), - content: privateFlavors.original_name, + content: flavor.original_name, }, { label: t('RAM'), - content: `${privateFlavors.ram / 1024} GB`, + content: `${flavor.ram / 1024} GB`, }, { label: t('VCPUs'), - content: privateFlavors.vcpus, + content: flavor.vcpus, }, // { // label: t('Disk'), - // content: `${privateFlavors.disk} GB`, + // content: `${flavor.disk} GB`, // }, ]; + if ( + extra_specs[':architecture'] === 'heterogeneous_computing' && + extra_specs[':category'] === + 'visualization_compute_optimized_type_with_gpu' + ) { + options.push({ + label: t('VGPU'), + content: extra_specs['resources:VGPU'], + }); + } return { title: t('Flavor Info'), options, diff --git a/src/stores/nova/hypervisor.js b/src/stores/nova/hypervisor.js index 080d19c3..363f293a 100644 --- a/src/stores/nova/hypervisor.js +++ b/src/stores/nova/hypervisor.js @@ -88,17 +88,38 @@ export class HypervisorStore extends Base { const result = await this.client.show(id); const originData = get(result, this.responseKey) || result; const item = this.mapperBeforeFetchProject(originData); - const inventoriesReuslt = await this.providerClient.inventories.list(id); + const { resource_providers } = await this.providerClient.list({ + in_tree: id, + }); + const provider = (resource_providers || []).filter((it) => it.uuid !== id); + const promiseArr = [this.providerClient.inventories.list(id)]; + if (provider.length) { + // 如果有provider,说明有VGPU + promiseArr.push( + this.providerClient.inventories.list(provider[0].uuid), + this.providerClient.usages.list(provider[0].uuid) + ); + } + const [inventoriesBase, inventoriesVGPU, usagesVGPU] = await Promise.all( + promiseArr + ); if (item.hypervisor_type !== 'ironic') { const { inventories: { VCPU: { allocation_ratio }, MEMORY_MB: { allocation_ratio: memory_ratio }, }, - } = inventoriesReuslt; + } = inventoriesBase; item.vcpus *= allocation_ratio; item.memory_mb *= memory_ratio; } + if (inventoriesVGPU && usagesVGPU) { + const { inventories: { VGPU: { allocation_ratio, total } } = {} } = + inventoriesVGPU; + item.vgpus = allocation_ratio * total; + const { usages: { VGPU } = {} } = usagesVGPU; + item.vgpus_used = VGPU; + } item.memory_mb_used_gb = getGBValue(item.memory_mb_used); item.memory_mb_gb = getGBValue(item.memory_mb); const newItem = await this.detailDidFetch(item, all_projects);