ui/app/components/namespace-resource-quota/component.js

235 lines
7.1 KiB
JavaScript

import { get, set, observer } from '@ember/object';
import { next } from '@ember/runloop';
import Component from '@ember/component';
import { convertToMillis } from 'shared/utils/util';
import { parseSi } from 'shared/utils/parse-unit';
import layout from './template';
import { inject as service } from '@ember/service';
const defaultRadix = 10;
const defaultIncrement = 1024;
const defaultDivisor = 1048576;
const defaultMultiplier = 3;
export default Component.extend({
intl: service(),
layout,
limit: null,
usedLimit: null,
projectlimit: null,
projectQuota: null,
nsDefaultQuota: null,
editing: null,
isNew: null,
quotaArray: null,
init() {
this._super(...arguments);
this.initQuotaArray();
next(() => {
this.quotaDidChange();
})
},
quotaDidChange: observer('quotaArray.@each.{key,value}', function() {
const out = {};
(this.quotaArray || []).forEach((quota) => {
if ( quota.key ) {
let value = parseInt(get(quota, 'value'), defaultRadix);
let max = get(quota, 'max');
let currentUse = get(quota, 'currentProjectUse.firstObject.value');
if ( value === undefined || value === null ) {
out[quota.key] = '';
return;
}
if (value > max || (( currentUse + value ) > max)) {
value = set(quota, 'value', max - currentUse);
}
out[quota.key] = this.quotaWithUnits(quota, value);
}
});
if (this.changed) {
this.changed(Object.keys(out).length ? out : null);
}
this.updateLimits();
}),
quotaWithUnits(quota, value, readable = false) {
let cpuNotation = readable ? 'milli CPUs' : 'm';
let memNotation = readable ? 'MiB' : 'Mi';
let storageNotation = readable ? 'GB' : 'Gi';
if ( quota.key === 'limitsCpu' || quota.key === 'requestsCpu' ) {
return `${ value }${ cpuNotation }`;
} else if ( quota.key === 'limitsMemory' || quota.key === 'requestsMemory' ) {
return `${ value }${ memNotation }`;
} else if ( quota.key === 'requestsStorage' ) {
return `${ value }${ storageNotation }`;
} else {
return value;
}
},
updateLimits() {
( this.quotaArray || [] ).forEach((quota) => {
if ( quota.key ) {
const intl = this.intl;
const value = parseInt(get(quota, 'value'), defaultRadix) || 0;
const usedValue = get(quota, 'currentProjectUse.firstObject.value');
const newUse = get(quota, 'currentProjectUse.lastObject');
const myNewUse = usedValue + value;
const remaining = ( get(quota, 'max') - ( myNewUse ) ) > 0 ? ( get(quota, 'max') - ( myNewUse ) ) : 0;
const newTotals = [
{
label: intl.t('formResourceQuota.table.resources.reserved'),
value: this.quotaWithUnits(quota, usedValue, true),
},
{
label: intl.t('formResourceQuota.table.resources.namespace'),
value: this.quotaWithUnits(quota, value, true),
},
{
label: intl.t('formResourceQuota.table.resources.available'),
value: this.quotaWithUnits(quota, remaining, true),
},
{
label: intl.t('formResourceQuota.table.resources.max'),
value: this.quotaWithUnits(quota, get(quota, 'max'), true),
}
];
// if (remaining === 0) {
// set(newUse, 'color', 'bg-error');
// } else {
// if (get(newUse, 'color') === 'bg-error') {
// set(newUse, 'color', 'bg-warning');
// }
// }
set(newUse, 'value', value);
set(quota, 'totalLimits', newTotals);
}
});
},
initQuotaArray() {
const {
limit,
nsDefaultQuota,
intl
} = this;
const used = this.usedLimit;
const currentProjectLimit = this.projectLimit
const array = [];
Object.keys(nsDefaultQuota).forEach((key) => {
if ( key !== 'type' && typeof nsDefaultQuota[key] === 'string') {
let value, currentProjectUse, totalLimits, remaining;
let usedValue = '';
let max = '';
let newUse = null;
let projectUse = get(used, key) || '0';
if ( limit && !limit[key] ) {
array.push({
key,
value: '',
currentProjectUse: [],
});
return;
}
value = limit && limit[key] ? limit[key] : nsDefaultQuota[key];
switch (key) {
case 'limitsCpu':
case 'requestsCpu':
value = convertToMillis(value);
usedValue = convertToMillis(projectUse);
max = convertToMillis(get(currentProjectLimit, key));
break;
case 'limitsMemory':
case 'requestsMemory':
value = parseSi(value, defaultIncrement) / defaultDivisor;
usedValue = parseSi(projectUse, defaultIncrement) / defaultDivisor;
max = parseSi(get(currentProjectLimit, key), defaultIncrement) / defaultDivisor;
break;
case 'requestsStorage':
value = parseSi(value) / (defaultIncrement ** defaultMultiplier);
usedValue = parseSi(projectUse) / (defaultIncrement ** defaultMultiplier);
max = parseSi(get(currentProjectLimit, key)) / (defaultIncrement ** defaultMultiplier);
break;
default:
value = parseInt(value, defaultRadix);
usedValue = parseInt(projectUse, defaultRadix);
max = parseInt(get(currentProjectLimit, key), defaultRadix);
break;
}
if ( !this.isNew ) {
usedValue = usedValue - value
}
newUse = usedValue + value;
remaining = ( max - newUse ) > 0 ? ( max - newUse ) : 0;
currentProjectUse = [
{
// current use
color: 'bg-primary',
label: key,
value: usedValue,
},
{
// only need the new value here because progress-multi-bar adds this to the previous
color: 'bg-info',
label: key,
value,
}
];
totalLimits = [
{
label: intl.t('formResourceQuota.table.resources.reserved'),
value: this.quotaWithUnits(nsDefaultQuota[key], usedValue, true),
},
{
label: intl.t('formResourceQuota.table.resources.namespace'),
value: this.quotaWithUnits(nsDefaultQuota[key], value, true),
},
{
label: intl.t('formResourceQuota.table.resources.available'),
value: this.quotaWithUnits(nsDefaultQuota[key], remaining, true),
},
{
label: intl.t('formResourceQuota.table.resources.max'),
value: this.quotaWithUnits(nsDefaultQuota[key], max, true),
}
];
array.push({
currentProjectUse,
key,
max,
totalLimits,
value,
});
}
});
set(this, 'quotaArray', array);
}
});