portainer/portainer

View on GitHub
app/kubernetes/helpers/resourceReservationHelper.js

Summary

Maintainability
A
0 mins
Test Coverage
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 += safeFilesizeParser(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')) {
      // milli
      res /= 1000;
    } else if (_.endsWith(cpu, 'u')) {
      // micro
      res /= 1000000;
    } else if (_.endsWith(cpu, 'n')) {
      // nano
      res /= 1000000000;
    } else if (_.endsWith(cpu, 'p')) {
      // pico
      res /= 1000000000000;
    }
    return res;
  }

  static megaBytesValue(value) {
    return Math.floor(safeFilesizeParser(value) / 1000 / 1000);
  }

  static bytesValue(mem) {
    return safeFilesizeParser(mem) * 1000 * 1000;
  }
}
export default KubernetesResourceReservationHelper;

function safeFilesizeParser(value, options) {
  if (!value || Number.isNaN(value)) {
    return 0;
  }

  return filesizeParser(value, options);
}