diff --git a/app/react/kubernetes/namespaces/ItemView/useNamespaceFormValues.ts b/app/react/kubernetes/namespaces/ItemView/useNamespaceFormValues.ts index b3f0202d7..e0c1507dd 100644 --- a/app/react/kubernetes/namespaces/ItemView/useNamespaceFormValues.ts +++ b/app/react/kubernetes/namespaces/ItemView/useNamespaceFormValues.ts @@ -4,7 +4,11 @@ import { StorageClass } from '@/react/portainer/environments/types'; import { Registry } from '@/react/portainer/registries/types/registry'; import { NamespaceFormValues, PortainerNamespace } from '../types'; -import { megaBytesValue, parseCPU } from '../resourceQuotaUtils'; +import { + megaBytesValue, + parseCPU, + convertBase2ToMiB, +} from '../resourceQuotaUtils'; import { IngressControllerClassMap } from '../../cluster/ingressClass/types'; interface ComputeInitialValuesParams { @@ -41,7 +45,7 @@ export function computeInitialValues({ ingressClasses: ingressClasses ?? [], resourceQuota: { enabled: !!memory || !!cpu, - memory: `${megaBytesValue(memory)}`, + memory: `${megaBytesValue(convertBase2ToMiB(memory))}`, cpu: `${parseCPU(cpu)}`, }, registries: registriesUsed ?? [], diff --git a/app/react/kubernetes/namespaces/resourceQuotaUtils.test.ts b/app/react/kubernetes/namespaces/resourceQuotaUtils.test.ts index 4376e996a..0b5878ea4 100644 --- a/app/react/kubernetes/namespaces/resourceQuotaUtils.test.ts +++ b/app/react/kubernetes/namespaces/resourceQuotaUtils.test.ts @@ -1,4 +1,4 @@ -import { parseCPU } from './resourceQuotaUtils'; +import { parseCPU, convertBase2ToMiB } from './resourceQuotaUtils'; // test parseCPU with '', '2', '100m', '100u' describe('parseCPU', () => { @@ -15,3 +15,19 @@ describe('parseCPU', () => { expect(parseCPU('100u')).toBe(0.0001); }); }); + +// test convertBase2ToMiB +describe('convertBase2ToMiB', () => { + it('should return empty string for empty string', () => { + expect(convertBase2ToMiB('')).toBe(''); + }); + it('should return 2Mi for 2Mi', () => { + expect(convertBase2ToMiB('2Mi')).toBe('2Mi'); + }); + it('should return 1024Mi for 1Gi', () => { + expect(convertBase2ToMiB('1Gi')).toBe('1024Mi'); + }); + it('should return 1024Mi for 1Ti', () => { + expect(convertBase2ToMiB('1Ti')).toBe('1048576Mi'); + }); +}); diff --git a/app/react/kubernetes/namespaces/resourceQuotaUtils.ts b/app/react/kubernetes/namespaces/resourceQuotaUtils.ts index b19879cf5..2285b8c22 100644 --- a/app/react/kubernetes/namespaces/resourceQuotaUtils.ts +++ b/app/react/kubernetes/namespaces/resourceQuotaUtils.ts @@ -51,6 +51,40 @@ export function bytesValue(mem: string | number) { return safeFilesizeParser(mem, 10) * 1000 * 1000; } +/** + * Coverts Ki, Gi, Ti, Pi, Ei suffix values to Mi string + * Used for kubernetes memory conversions currently + */ +export function convertBase2ToMiB(value: string | number) { + if (typeof value === 'number') { + return value; + } + + // Extract the numeric part and suffix + const match = value.match(/^(\d+(?:\.\d+)?)([A-Za-z]*)$/); + if (!match) { + return value; + } + + const numericValue = parseFloat(match[1]); + const suffix = match[2]; + + switch (suffix) { + case 'Mi': + return `${numericValue}Mi`; + case 'Gi': + return `${numericValue * 1024}Mi`; + case 'Ti': + return `${numericValue * 1024 * 1024}Mi`; + case 'Pi': + return `${numericValue * 1024 * 1024 * 1024}Mi`; + case 'Ei': + return `${numericValue * 1024 * 1024 * 1024 * 1024}Mi`; + default: + return value; + } +} + /** * The default base is 2, you can use base 10 if you want * https://github.com/patrickkettner/filesize-parser#readme