skyline/src/stores/nova/flavor.js

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;