277 lines
7.4 KiB
JavaScript
277 lines
7.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;
|
|
|
|
// let newItems = tab
|
|
// ? items.filter((it) => it.architecture === tab)
|
|
// : items;
|
|
// console.log('hahahahah')
|
|
// console.log(newItems)
|
|
// return newItems;
|
|
// }
|
|
|
|
// async listDidFetch(items, _, filters) {
|
|
// const { tab } = filters;
|
|
|
|
// // Fetch data and log it
|
|
// try {
|
|
// const response = await fetch('https://baha-dev.felcloud.io/all_flavors');
|
|
// if (!response.ok) {
|
|
// throw new Error(`HTTP error! Status: ${response.status}`);
|
|
// }
|
|
// const data = await response.json();
|
|
// console.log('Fetched Data:', data);
|
|
// } catch (error) {
|
|
// console.error('Error fetching data:', error);
|
|
// }
|
|
// // Original logic remains unchanged
|
|
// let newItems = tab
|
|
// ? items.filter((it) => it.architecture === tab)
|
|
// : items;
|
|
|
|
// console.log('hahahahah');
|
|
// console.log(newItems);
|
|
// return newItems;
|
|
// }
|
|
|
|
async listDidFetch(items, _, filters) {
|
|
const { tab } = filters;
|
|
let fetchedData = [];
|
|
try {
|
|
const response = await fetch('https://baha-dev.felcloud.io/all_flavors');
|
|
if (!response.ok) {
|
|
throw new Error(`HTTP error! Status: ${response.status}`);
|
|
}
|
|
const data = await response.json();
|
|
console.log('Fetched Data:', data);
|
|
fetchedData = data.flatMap((entry) => entry.compute);
|
|
} catch (error) {
|
|
console.error('Error fetching data:', error);
|
|
return items;
|
|
}
|
|
let newItems = tab ? items.filter((it) => it.architecture === tab) : items;
|
|
newItems = newItems.map((item) => {
|
|
const match = fetchedData.find((flavor) => flavor.flavor === item.name);
|
|
if (match) {
|
|
const eurPrice = match.price.find((p) => p.name === 'EUR')?.value || 0;
|
|
const priceEurPerHour = parseFloat(eurPrice).toFixed(3);
|
|
const priceEurPerSecond = (priceEurPerHour / 3600).toFixed(5);
|
|
const priceEurPerMonth = (priceEurPerHour * 24 * 30).toFixed(3);
|
|
return {
|
|
...item,
|
|
priceEurPerHour,
|
|
priceEurPerSecond,
|
|
priceEurPerMonth,
|
|
};
|
|
}
|
|
return item;
|
|
});
|
|
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;
|