mirror of https://github.com/rancher/ui.git
235 lines
7.1 KiB
JavaScript
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);
|
|
}
|
|
});
|