mirror of https://github.com/portainer/portainer
				
				
				
			
		
			
				
	
	
		
			139 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
			
		
		
	
	
			139 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
import { filesize } from 'filesize';
 | 
						|
import { FileSizeOptions } from 'filesize/types/filesize';
 | 
						|
import filesizeParser from 'filesize-parser';
 | 
						|
 | 
						|
import { Annotation } from './annotations/types';
 | 
						|
 | 
						|
/**
 | 
						|
 * parseCPU converts a CPU string to a number in cores.
 | 
						|
 * It supports m (milli), u (micro), n (nano), p (pico) suffixes.
 | 
						|
 *
 | 
						|
 * If given an empty string, it returns 0.
 | 
						|
 */
 | 
						|
export function parseCPU(cpu: string) {
 | 
						|
  if (!cpu) {
 | 
						|
    return 0;
 | 
						|
  }
 | 
						|
 | 
						|
  let res = parseInt(cpu, 10);
 | 
						|
  if (cpu.endsWith('m')) {
 | 
						|
    res /= 1000;
 | 
						|
  } else if (cpu.endsWith('u')) {
 | 
						|
    res /= 1000000;
 | 
						|
  } else if (cpu.endsWith('n')) {
 | 
						|
    res /= 1000000000;
 | 
						|
  } else if (cpu.endsWith('p')) {
 | 
						|
    res /= 1000000000000;
 | 
						|
  }
 | 
						|
  return res;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Converts a byte value to a human-readable string format
 | 
						|
 *
 | 
						|
 * In Kubernetes, resource measurements for memory are typically in binary units (KiB, MiB, GiB).
 | 
						|
 * This function formats raw byte values into human-readable strings using the IEC standard
 | 
						|
 * by default, which is the standard used in Kubernetes resource specifications.
 | 
						|
 *
 | 
						|
 * @param memoryBytes - The memory size in bytes
 | 
						|
 * @param options - Options for formatting (defaults to IEC standard)
 | 
						|
 * @returns Human-readable memory size (e.g., "100 MiB")
 | 
						|
 */
 | 
						|
export function bytesToReadableFormat(
 | 
						|
  memoryBytes: number,
 | 
						|
  options: FileSizeOptions = {
 | 
						|
    output: 'string',
 | 
						|
    // IEC is used by default, because it's the most common standard for memory units in Kubernetes.
 | 
						|
    standard: 'iec',
 | 
						|
  }
 | 
						|
) {
 | 
						|
  return filesize(memoryBytes, options);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Gets a value in mebibytes (MiB) using the filesize library
 | 
						|
 *
 | 
						|
 * This function always returns the memory value converted to MiB,
 | 
						|
 * regardless of the size. It uses the filesize library with specific
 | 
						|
 * configuration to ensure consistent MiB output.
 | 
						|
 *
 | 
						|
 * @param memoryBytes - The memory size in bytes
 | 
						|
 * @returns The memory size in MiB as a number
 | 
						|
 */
 | 
						|
export function getMebibytes(memoryBytes: number): number {
 | 
						|
  const result = filesize(memoryBytes, {
 | 
						|
    standard: 'iec',
 | 
						|
    output: 'array',
 | 
						|
    exponent: 2, // Force MiB as the unit (2^20 bytes)
 | 
						|
    round: 0,
 | 
						|
  });
 | 
						|
 | 
						|
  // Return just the numerical value (first element of the array)
 | 
						|
  return result[0];
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Parses a value using the filesize-parser library and gives the result in bytes.
 | 
						|
 *
 | 
						|
 * This function handles both string and number inputs.
 | 
						|
 * If the base is not provided, the value is a string and it contains 'i' (e.g. "100MiB"), use base 2 (binary/IEC).
 | 
						|
 * Otherwise, it uses the provided base (defaulting to 10).
 | 
						|
 */
 | 
						|
export function safeFilesizeParser(value: string | number, base?: 2 | 10) {
 | 
						|
  if (!value || Number.isNaN(value)) {
 | 
						|
    return 0;
 | 
						|
  }
 | 
						|
 | 
						|
  // If the value is a string and contains 'i' (e.g. "100MiB"), use base 2 (binary/IEC)
 | 
						|
  const hasBinaryUnit = typeof value === 'string' && value.includes('i');
 | 
						|
  const inferredBase = hasBinaryUnit ? 2 : 10;
 | 
						|
 | 
						|
  return filesizeParser(value, { base: base ?? inferredBase });
 | 
						|
}
 | 
						|
 | 
						|
export function prepareAnnotations(annotations?: Annotation[]) {
 | 
						|
  const result = annotations?.reduce(
 | 
						|
    (acc, a) => {
 | 
						|
      acc[a.key] = a.value;
 | 
						|
      return acc;
 | 
						|
    },
 | 
						|
    {} as Record<string, string>
 | 
						|
  );
 | 
						|
  return result;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Returns the safe value of the given number or string.
 | 
						|
 * @param value - The value to get the safe value for.
 | 
						|
 * @returns The safe value of the given number or string.
 | 
						|
 */
 | 
						|
export function getSafeValue(value: number | string) {
 | 
						|
  const valueNumber = Number(value);
 | 
						|
  if (Number.isNaN(valueNumber)) {
 | 
						|
    return 0;
 | 
						|
  }
 | 
						|
  return valueNumber;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Returns the percentage of the value over the total.
 | 
						|
 * @param value - The value to calculate the percentage for.
 | 
						|
 * @param total - The total value to compare the percentage to.
 | 
						|
 * @returns The percentage of the value over the total, with the '- ' string prefixed, for example '- 50%'.
 | 
						|
 */
 | 
						|
export function getPercentageString(value: number, total?: number | string) {
 | 
						|
  const totalNumber = Number(total);
 | 
						|
  if (
 | 
						|
    totalNumber === 0 ||
 | 
						|
    total === undefined ||
 | 
						|
    total === '' ||
 | 
						|
    Number.isNaN(totalNumber)
 | 
						|
  ) {
 | 
						|
    return '';
 | 
						|
  }
 | 
						|
  if (value > totalNumber) {
 | 
						|
    return '- Exceeded';
 | 
						|
  }
 | 
						|
  return `- ${Math.round((value / totalNumber) * 100)}%`;
 | 
						|
}
 |