mirror of https://github.com/docker/compose.git
Distinguish limits for Fargate and EC2
Signed-off-by: Nicolas De Loof <nicolas.deloof@gmail.com>
This commit is contained in:
parent
109ba96743
commit
2cfaf69546
|
@ -277,7 +277,7 @@ func (b *ecsAPIService) convert(project *types.Project) (*cloudformation.Templat
|
||||||
LoadBalancers: serviceLB,
|
LoadBalancers: serviceLB,
|
||||||
NetworkConfiguration: &ecs.Service_NetworkConfiguration{
|
NetworkConfiguration: &ecs.Service_NetworkConfiguration{
|
||||||
AwsvpcConfiguration: &ecs.Service_AwsVpcConfiguration{
|
AwsvpcConfiguration: &ecs.Service_AwsVpcConfiguration{
|
||||||
AssignPublicIp: ecsapi.AssignPublicIpDisabled,
|
AssignPublicIp: ecsapi.AssignPublicIpEnabled,
|
||||||
SecurityGroups: serviceSecurityGroups,
|
SecurityGroups: serviceSecurityGroups,
|
||||||
Subnets: []string{
|
Subnets: []string{
|
||||||
cloudformation.Ref(parameterSubnet1Id),
|
cloudformation.Ref(parameterSubnet1Id),
|
||||||
|
|
|
@ -245,6 +245,15 @@ services:
|
||||||
|
|
||||||
func TestTaskSizeConvert(t *testing.T) {
|
func TestTaskSizeConvert(t *testing.T) {
|
||||||
template := convertYaml(t, `
|
template := convertYaml(t, `
|
||||||
|
services:
|
||||||
|
test:
|
||||||
|
image: nginx
|
||||||
|
`)
|
||||||
|
def := template.Resources["TestTaskDefinition"].(*ecs.TaskDefinition)
|
||||||
|
assert.Equal(t, def.Cpu, "256")
|
||||||
|
assert.Equal(t, def.Memory, "512")
|
||||||
|
|
||||||
|
template = convertYaml(t, `
|
||||||
services:
|
services:
|
||||||
test:
|
test:
|
||||||
image: nginx
|
image: nginx
|
||||||
|
@ -253,11 +262,8 @@ services:
|
||||||
limits:
|
limits:
|
||||||
cpus: '0.5'
|
cpus: '0.5'
|
||||||
memory: 2048M
|
memory: 2048M
|
||||||
reservations:
|
|
||||||
cpus: '0.5'
|
|
||||||
memory: 2048M
|
|
||||||
`)
|
`)
|
||||||
def := template.Resources["TestTaskDefinition"].(*ecs.TaskDefinition)
|
def = template.Resources["TestTaskDefinition"].(*ecs.TaskDefinition)
|
||||||
assert.Equal(t, def.Cpu, "512")
|
assert.Equal(t, def.Cpu, "512")
|
||||||
assert.Equal(t, def.Memory, "2048")
|
assert.Equal(t, def.Memory, "2048")
|
||||||
|
|
||||||
|
@ -270,13 +276,29 @@ services:
|
||||||
limits:
|
limits:
|
||||||
cpus: '4'
|
cpus: '4'
|
||||||
memory: 8192M
|
memory: 8192M
|
||||||
reservations:
|
|
||||||
cpus: '4'
|
|
||||||
memory: 8192M
|
|
||||||
`)
|
`)
|
||||||
def = template.Resources["TestTaskDefinition"].(*ecs.TaskDefinition)
|
def = template.Resources["TestTaskDefinition"].(*ecs.TaskDefinition)
|
||||||
assert.Equal(t, def.Cpu, "4096")
|
assert.Equal(t, def.Cpu, "4096")
|
||||||
assert.Equal(t, def.Memory, "8192")
|
assert.Equal(t, def.Memory, "8192")
|
||||||
|
|
||||||
|
template = convertYaml(t, `
|
||||||
|
services:
|
||||||
|
test:
|
||||||
|
image: nginx
|
||||||
|
deploy:
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
cpus: '4'
|
||||||
|
memory: 792Mb
|
||||||
|
reservations:
|
||||||
|
generic_resources:
|
||||||
|
- discrete_resource_spec:
|
||||||
|
kind: gpus
|
||||||
|
value: 2
|
||||||
|
`)
|
||||||
|
def = template.Resources["TestTaskDefinition"].(*ecs.TaskDefinition)
|
||||||
|
assert.Equal(t, def.Cpu, "4000")
|
||||||
|
assert.Equal(t, def.Memory, "792")
|
||||||
}
|
}
|
||||||
func TestTaskSizeConvertFailure(t *testing.T) {
|
func TestTaskSizeConvertFailure(t *testing.T) {
|
||||||
model := loadConfig(t, `
|
model := loadConfig(t, `
|
||||||
|
|
|
@ -323,8 +323,17 @@ func toSystemControls(sysctls types.Mapping) []ecs.TaskDefinition_SystemControl
|
||||||
const miB = 1024 * 1024
|
const miB = 1024 * 1024
|
||||||
|
|
||||||
func toLimits(service types.ServiceConfig) (string, string, error) {
|
func toLimits(service types.ServiceConfig) (string, string, error) {
|
||||||
// All possible CPU/mem values for Fargate
|
mem, cpu, err := getConfiguredLimits(service)
|
||||||
cpuToMem := map[int64][]types.UnitBytes{
|
if err != nil {
|
||||||
|
return "", "", err
|
||||||
|
}
|
||||||
|
if requireEC2(service) {
|
||||||
|
// just return configured limits expressed in Mb and CPU units
|
||||||
|
return fmt.Sprint(cpu), fmt.Sprint(mem / miB), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// All possible cpu/mem values for Fargate
|
||||||
|
fargateCPUToMem := map[int64][]types.UnitBytes{
|
||||||
256: {512, 1024, 2048},
|
256: {512, 1024, 2048},
|
||||||
512: {1024, 2048, 3072, 4096},
|
512: {1024, 2048, 3072, 4096},
|
||||||
1024: {2048, 3072, 4096, 5120, 6144, 7168, 8192},
|
1024: {2048, 3072, 4096, 5120, 6144, 7168, 8192},
|
||||||
|
@ -333,37 +342,22 @@ func toLimits(service types.ServiceConfig) (string, string, error) {
|
||||||
}
|
}
|
||||||
cpuLimit := "256"
|
cpuLimit := "256"
|
||||||
memLimit := "512"
|
memLimit := "512"
|
||||||
|
if mem == 0 && cpu == 0 {
|
||||||
if service.Deploy == nil {
|
|
||||||
return cpuLimit, memLimit, nil
|
return cpuLimit, memLimit, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
limits := service.Deploy.Resources.Limits
|
|
||||||
if limits == nil {
|
|
||||||
return cpuLimit, memLimit, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if limits.NanoCPUs == "" {
|
|
||||||
return cpuLimit, memLimit, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
v, err := opts.ParseCPUs(limits.NanoCPUs)
|
|
||||||
if err != nil {
|
|
||||||
return "", "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
var cpus []int64
|
var cpus []int64
|
||||||
for k := range cpuToMem {
|
for k := range fargateCPUToMem {
|
||||||
cpus = append(cpus, k)
|
cpus = append(cpus, k)
|
||||||
}
|
}
|
||||||
sort.Slice(cpus, func(i, j int) bool { return cpus[i] < cpus[j] })
|
sort.Slice(cpus, func(i, j int) bool { return cpus[i] < cpus[j] })
|
||||||
|
|
||||||
for _, cpu := range cpus {
|
for _, fargateCPU := range cpus {
|
||||||
mem := cpuToMem[cpu]
|
options := fargateCPUToMem[fargateCPU]
|
||||||
if v <= cpu*miB {
|
if cpu <= fargateCPU {
|
||||||
for _, m := range mem {
|
for _, m := range options {
|
||||||
if limits.MemoryBytes <= m*miB {
|
if mem <= m*miB {
|
||||||
cpuLimit = strconv.FormatInt(cpu, 10)
|
cpuLimit = strconv.FormatInt(fargateCPU, 10)
|
||||||
memLimit = strconv.FormatInt(int64(m), 10)
|
memLimit = strconv.FormatInt(int64(m), 10)
|
||||||
return cpuLimit, memLimit, nil
|
return cpuLimit, memLimit, nil
|
||||||
}
|
}
|
||||||
|
@ -373,6 +367,27 @@ func toLimits(service types.ServiceConfig) (string, string, error) {
|
||||||
return "", "", fmt.Errorf("the resources requested are not supported by ECS/Fargate")
|
return "", "", fmt.Errorf("the resources requested are not supported by ECS/Fargate")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getConfiguredLimits(service types.ServiceConfig) (types.UnitBytes, int64, error) {
|
||||||
|
if service.Deploy == nil {
|
||||||
|
return 0, 0, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
limits := service.Deploy.Resources.Limits
|
||||||
|
if limits == nil {
|
||||||
|
return 0, 0, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if limits.NanoCPUs == "" {
|
||||||
|
return limits.MemoryBytes, 0, nil
|
||||||
|
}
|
||||||
|
v, err := opts.ParseCPUs(limits.NanoCPUs)
|
||||||
|
if err != nil {
|
||||||
|
return 0, 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return limits.MemoryBytes, v / 1e6, nil
|
||||||
|
}
|
||||||
|
|
||||||
func toContainerReservation(service types.ServiceConfig) (string, int) {
|
func toContainerReservation(service types.ServiceConfig) (string, int) {
|
||||||
cpuReservation := ".0"
|
cpuReservation := ".0"
|
||||||
memReservation := 0
|
memReservation := 0
|
||||||
|
|
|
@ -92,7 +92,7 @@ func (s sdk) CheckRequirements(ctx context.Context, region string) error {
|
||||||
if *serviceLongArnFormat != "enabled" {
|
if *serviceLongArnFormat != "enabled" {
|
||||||
return fmt.Errorf("this tool requires the \"new ARN resource ID format\".\n"+
|
return fmt.Errorf("this tool requires the \"new ARN resource ID format\".\n"+
|
||||||
"Check https://%s.console.aws.amazon.com/ecs/home#/settings\n"+
|
"Check https://%s.console.aws.amazon.com/ecs/home#/settings\n"+
|
||||||
"Learn more: https://aws.amazon.com/blogs/compute/migrating-your-amazon-ecs-deployment-to-the-new-arn-and-resource-ID-format-2", region)
|
"Learn more: https://aws.amazon.com/blogs/compute/migrating-your-amazon-ecs-deployment-to-the-new-arn-and-resource-id-format-2", region)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Copyright 2020 Docker, Inc.
|
Copyright 2020 Docker Compose CLI authors
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
|
|
|
@ -107,7 +107,7 @@
|
||||||
],
|
],
|
||||||
"NetworkConfiguration": {
|
"NetworkConfiguration": {
|
||||||
"AwsvpcConfiguration": {
|
"AwsvpcConfiguration": {
|
||||||
"AssignPublicIp": "DISABLED",
|
"AssignPublicIp": "ENABLED",
|
||||||
"SecurityGroups": [
|
"SecurityGroups": [
|
||||||
{
|
{
|
||||||
"Ref": "TestSimpleConvertDefaultNetwork"
|
"Ref": "TestSimpleConvertDefaultNetwork"
|
||||||
|
|
Loading…
Reference in New Issue