github.com/defang-io/defang/src@v0.0.0-20240505002154-bdf411911834/pkg/clouds/aws/ecs/fargate.go (about) 1 package ecs 2 3 import ( 4 "fmt" 5 "math" 6 ) 7 8 type CpuUnits = uint 9 type MemoryMiB = uint 10 11 func makeMinMaxCeil(value float64, min, max, step uint) uint { 12 if value <= float64(min) || math.IsNaN(value) { 13 return min 14 } else if value >= float64(max) { 15 return max 16 } 17 return uint(math.Ceil(value/float64(step))) * step 18 19 } 20 21 func fixupFargateCPU(vCpu float64) CpuUnits { 22 return 1 << makeMinMaxCeil(math.Log2(vCpu)+10, 8, 14, 1) // 256…16384 23 } 24 25 func fixupFargateMemory(cpu CpuUnits, memoryMiB float64) MemoryMiB { 26 switch cpu { 27 case 256: // 0.25 vCPU 28 return makeMinMaxCeil(memoryMiB, 512, 2048, 1024) 29 case 512: // 0.5 vCPU 30 return makeMinMaxCeil(memoryMiB, 1024, 4096, 1024) 31 case 1024: // 1 vCPU 32 return makeMinMaxCeil(memoryMiB, 2048, 8192, 1024) 33 case 2048: // 2 vCPU 34 return makeMinMaxCeil(memoryMiB, 4096, 16384, 1024) 35 case 4096: // 4 vCPU 36 return makeMinMaxCeil(memoryMiB, 8192, 30720, 1024) 37 case 8192: // 8 vCPU 38 return makeMinMaxCeil(memoryMiB, 16384, 61440, 4096) 39 case 16384: // 16 vCPU 40 return makeMinMaxCeil(memoryMiB, 32768, 122880, 4096) 41 default: 42 panic(fmt.Sprintf("Unsupported value for cpu: %v", cpu)) 43 } 44 } 45 46 func FixupFargateConfig(vCpu, memoryMiB float64) (cpu CpuUnits, memory MemoryMiB) { 47 for cpu = fixupFargateCPU(vCpu); ; cpu *= 2 { 48 memory = fixupFargateMemory(cpu, memoryMiB) 49 if float64(memory) >= memoryMiB { 50 return 51 } 52 } 53 }