1b2f3ded58
* fix(resource-reservation): Invalid total CPU count in multiple places * fix(ldap): apply default filters on search (#60) * fix(k8s/resourcepool): fix CPU count in resource pool creation * fix(k8s/resourcepool): round CPU count to one decimal * fix(app): possibly unhandled rejections * chorse(deps): update liblicense (#62) * fix(licenses): show message when license is invalid (#66) * fix(licenses): show message when license is invalid * fix(licenses): align icon * feat(license): prevent removal of all licenses (#65) * feat(license): prevent removal of all licenses * fix(license): skip caching of info if all licenses failed * fix(ldap): clear settings when moving from custom to openldap (#64) * fix(ldap): parse both lower and upper case domain (#63) * fix(ldap): use a specific openldap settings (#67) * feat(ldap): disable anonymous mode in openldap (#68) * fix(k8s/application): persisted folders restriction (#69) * fix(build/kompose): bump Kompose version (#70) * fix(resource-reservation): Invalid total CPU count in multiple places * fix(resource-reservation): Invalid total CPU count in multiple places Co-authored-by: Chaim Lev-Ari <chiptus@users.noreply.github.com> Co-authored-by: alice groux <alice.grx@gmail.com> Co-authored-by: xAt0mZ <baron_l@epitech.eu> Co-authored-by: Anthony Lapenna <anthony.lapenna@portainer.io> Co-authored-by: xAt0mZ <xAt0mZ@users.noreply.github.com>
75 lines
2.4 KiB
JavaScript
75 lines
2.4 KiB
JavaScript
import _ from 'lodash-es';
|
|
import filesizeParser from 'filesize-parser';
|
|
import { KubernetesResourceReservation } from 'Kubernetes/models/resource-reservation/models';
|
|
|
|
class KubernetesResourceReservationHelper {
|
|
static computeResourceReservation(pods) {
|
|
const containers = _.reduce(pods, (acc, pod) => _.concat(acc, pod.Containers), []);
|
|
|
|
return _.reduce(
|
|
containers,
|
|
(acc, container) => {
|
|
if (container.Requests) {
|
|
if (container.Requests.memory) {
|
|
acc.Memory += filesizeParser(container.Requests.memory, { base: 10 });
|
|
}
|
|
|
|
if (container.Requests.cpu) {
|
|
acc.CPU += KubernetesResourceReservationHelper.parseCPU(container.Requests.cpu);
|
|
}
|
|
}
|
|
|
|
return acc;
|
|
},
|
|
new KubernetesResourceReservation()
|
|
);
|
|
}
|
|
|
|
static parseCPU(cpu) {
|
|
let res = parseInt(cpu, 10);
|
|
if (_.endsWith(cpu, 'm')) {
|
|
res /= 1000;
|
|
}
|
|
return res;
|
|
}
|
|
|
|
static megaBytesValue(value) {
|
|
return Math.floor(filesizeParser(value) / 1000 / 1000);
|
|
}
|
|
|
|
static bytesValue(mem) {
|
|
return filesizeParser(mem) * 1000 * 1000;
|
|
}
|
|
|
|
static computeSliderMaxResources(nodes, pools, name, resourceOverCommitEnabled, resourceOverCommitPercent) {
|
|
let maxResources = { CPU: 0, Memory: 0 };
|
|
_.forEach(nodes, (item) => {
|
|
maxResources.CPU += item.CPU;
|
|
maxResources.Memory += filesizeParser(item.Memory);
|
|
});
|
|
maxResources.CPU = Math.trunc(maxResources.CPU * 10) / 10;
|
|
maxResources.Memory = KubernetesResourceReservationHelper.megaBytesValue(maxResources.Memory);
|
|
|
|
if (!resourceOverCommitEnabled) {
|
|
const reservedResources = _.reduce(
|
|
pools,
|
|
(acc, pool) => {
|
|
if (pool.Quota && pool.Namespace.Name !== name) {
|
|
acc.CPU += pool.Quota.CpuLimit;
|
|
acc.Memory += pool.Quota.MemoryLimit;
|
|
}
|
|
return acc;
|
|
},
|
|
{ CPU: 0, Memory: 0 }
|
|
);
|
|
if (reservedResources.Memory) {
|
|
reservedResources.Memory = KubernetesResourceReservationHelper.megaBytesValue(reservedResources.Memory);
|
|
}
|
|
maxResources.CPU = Math.trunc(parseFloat(maxResources.CPU - (maxResources.CPU * resourceOverCommitPercent) / 100 - reservedResources.CPU) * 10) / 10;
|
|
maxResources.Memory = parseInt(maxResources.Memory - (maxResources.Memory * resourceOverCommitPercent) / 100 - reservedResources.Memory, 10);
|
|
}
|
|
return maxResources;
|
|
}
|
|
}
|
|
export default KubernetesResourceReservationHelper;
|