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  }