skyline/src/stores/nova/flavor.js
xusongfu ccf2942c78 fix: Fix GPU type
GPU type was lost for visual GPU

Change-Id: Ibcf62cefb554172841ffee1fffad49cb2ba40dab
2023-11-16 15:23:32 +08:00

215 lines
5.4 KiB
JavaScript

// Copyright 2021 99cloud
//
// Licensed 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.
/* eslint-disable prefer-destructuring */
import { action, observable } from 'mobx';
import client from 'client';
import Base from 'stores/base';
export class FlavorStore extends Base {
@observable
access = [];
get listWithDetail() {
return true;
}
get client() {
return client.nova.flavors;
}
getGpuInfo = (record) => {
const { extra_specs = {} } = record || {};
const alias = extra_specs['pci_passthrough:alias'];
const vgpu = extra_specs['resources:VGPU'];
const category = extra_specs[':category'];
let gpuType = '-';
let gpuCount = '-';
let usbType = '-';
let usbCount = '-';
if (vgpu) {
gpuType = (vgpu || '').split(':')[0];
gpuCount = (vgpu || '').split(':')[1];
}
if (alias) {
if (category && !category.includes('visualization_')) {
const gpu = alias.split(',')[0];
const usb = alias.split(',')[1];
gpuType = gpu.split(':')[0];
gpuCount = gpu.split(':')[1];
if (usb) {
usbType = usb.split(':')[0];
usbCount = usb.split(':')[1];
}
} else {
const usb = alias.split(',')[0];
usbType = usb.split(':')[0];
usbCount = usb.split(':')[1];
}
}
return {
gpuType,
gpuCount,
usbType,
usbCount,
};
};
get mapperBeforeFetchProject() {
return (data) => {
const { extra_specs: { key, ...extraRest } = {}, ...rest } = data;
const gpuInfo = this.getGpuInfo(data);
return {
...rest,
...extraRest,
architecture: extraRest[':architecture'] || 'custom',
category: extraRest[':category'],
...gpuInfo,
is_public: rest['os-flavor-access:is_public'],
originData: data,
};
};
}
get paramsFunc() {
return (params) => {
const { all_projects, name, ...rest } = params;
if (all_projects) {
return {
...rest,
is_public: 'None',
};
}
return {
name,
...rest,
};
};
}
async listDidFetch(items, _, filters) {
const { tab } = filters;
const newItems = tab
? items.filter((it) => it.architecture === tab)
: items;
return newItems;
}
@action
async fetchAccess(id) {
const result = await this.client.access.list(id);
this.access = result.flavor_access;
}
@action
async create(data, extraSpecs, accessControl) {
const body = {};
body[this.responseKey] = data;
try {
this.isSubmitting = true;
const result = await this.client.create(body);
const { id } = result.flavor;
const extraBody = {
extra_specs: extraSpecs,
};
if (accessControl && accessControl.length > 0) {
await Promise.all(
accessControl.map((it) => {
const accessBody = {
addTenantAccess: {
tenant: it,
},
};
return this.client.action(id, accessBody);
})
);
}
return this.submitting(this.client.extraSpecs.create(id, extraBody));
} catch (error) {
this.isSubmitting = false;
return Promise.reject(error);
}
}
@action
async updateAccess(id, adds, dels) {
this.isSubmitting = true;
await Promise.all(
adds.map((it) => {
const accessBody = {
addTenantAccess: {
tenant: it,
},
};
return this.client.action(id, accessBody);
})
);
return this.submitting(
Promise.all(
dels.map((it) => {
const accessBody = {
removeTenantAccess: {
tenant: it,
},
};
return this.client.action(id, accessBody);
})
)
);
}
@action
async createExtraSpecs(id, extraSpecs) {
const extraBody = {
extra_specs: extraSpecs,
};
return this.submitting(this.client.extraSpecs.create(id, extraBody));
}
@action
async deleteExtraSpecs(id, key) {
return this.submitting(this.client.extraSpecs.delete(id, key));
}
@action
async putExtraSpecs(id, key, body) {
return this.submitting(this.client.extraSpecs.update(id, key, body));
}
@action
async updateExtraSpecs(id, adds = [], updates = [], dels = []) {
if (adds.length > 0) {
const addBody = {};
adds.forEach((item) => {
addBody[item.key] = item.value;
});
await this.createExtraSpecs(id, addBody);
}
if (updates.length > 0) {
await Promise.all(
updates.map((item) =>
this.putExtraSpecs(id, item.key, { [item.key]: item.value })
)
);
}
if (dels.length > 0) {
await Promise.all(dels.map((item) => this.deleteExtraSpecs(id, item)));
}
return Promise.resolve();
}
}
const globalFlavorStore = new FlavorStore();
export default globalFlavorStore;