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,
 | 
			
		||||
			NetworkConfiguration: &ecs.Service_NetworkConfiguration{
 | 
			
		||||
				AwsvpcConfiguration: &ecs.Service_AwsVpcConfiguration{
 | 
			
		||||
					AssignPublicIp: ecsapi.AssignPublicIpDisabled,
 | 
			
		||||
					AssignPublicIp: ecsapi.AssignPublicIpEnabled,
 | 
			
		||||
					SecurityGroups: serviceSecurityGroups,
 | 
			
		||||
					Subnets: []string{
 | 
			
		||||
						cloudformation.Ref(parameterSubnet1Id),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -245,6 +245,15 @@ services:
 | 
			
		|||
 | 
			
		||||
func TestTaskSizeConvert(t *testing.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:
 | 
			
		||||
  test:
 | 
			
		||||
    image: nginx
 | 
			
		||||
| 
						 | 
				
			
			@ -253,11 +262,8 @@ services:
 | 
			
		|||
        limits:
 | 
			
		||||
          cpus: '0.5'
 | 
			
		||||
          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.Memory, "2048")
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -270,13 +276,29 @@ services:
 | 
			
		|||
        limits:
 | 
			
		||||
          cpus: '4'
 | 
			
		||||
          memory: 8192M
 | 
			
		||||
        reservations:
 | 
			
		||||
          cpus: '4'
 | 
			
		||||
          memory: 8192M
 | 
			
		||||
`)
 | 
			
		||||
	def = template.Resources["TestTaskDefinition"].(*ecs.TaskDefinition)
 | 
			
		||||
	assert.Equal(t, def.Cpu, "4096")
 | 
			
		||||
	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) {
 | 
			
		||||
	model := loadConfig(t, `
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -323,8 +323,17 @@ func toSystemControls(sysctls types.Mapping) []ecs.TaskDefinition_SystemControl
 | 
			
		|||
const miB = 1024 * 1024
 | 
			
		||||
 | 
			
		||||
func toLimits(service types.ServiceConfig) (string, string, error) {
 | 
			
		||||
	// All possible CPU/mem values for Fargate
 | 
			
		||||
	cpuToMem := map[int64][]types.UnitBytes{
 | 
			
		||||
	mem, cpu, err := getConfiguredLimits(service)
 | 
			
		||||
	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},
 | 
			
		||||
		512:  {1024, 2048, 3072, 4096},
 | 
			
		||||
		1024: {2048, 3072, 4096, 5120, 6144, 7168, 8192},
 | 
			
		||||
| 
						 | 
				
			
			@ -333,37 +342,22 @@ func toLimits(service types.ServiceConfig) (string, string, error) {
 | 
			
		|||
	}
 | 
			
		||||
	cpuLimit := "256"
 | 
			
		||||
	memLimit := "512"
 | 
			
		||||
 | 
			
		||||
	if service.Deploy == nil {
 | 
			
		||||
	if mem == 0 && cpu == 0 {
 | 
			
		||||
		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
 | 
			
		||||
	for k := range cpuToMem {
 | 
			
		||||
	for k := range fargateCPUToMem {
 | 
			
		||||
		cpus = append(cpus, k)
 | 
			
		||||
	}
 | 
			
		||||
	sort.Slice(cpus, func(i, j int) bool { return cpus[i] < cpus[j] })
 | 
			
		||||
 | 
			
		||||
	for _, cpu := range cpus {
 | 
			
		||||
		mem := cpuToMem[cpu]
 | 
			
		||||
		if v <= cpu*miB {
 | 
			
		||||
			for _, m := range mem {
 | 
			
		||||
				if limits.MemoryBytes <= m*miB {
 | 
			
		||||
					cpuLimit = strconv.FormatInt(cpu, 10)
 | 
			
		||||
	for _, fargateCPU := range cpus {
 | 
			
		||||
		options := fargateCPUToMem[fargateCPU]
 | 
			
		||||
		if cpu <= fargateCPU {
 | 
			
		||||
			for _, m := range options {
 | 
			
		||||
				if mem <= m*miB {
 | 
			
		||||
					cpuLimit = strconv.FormatInt(fargateCPU, 10)
 | 
			
		||||
					memLimit = strconv.FormatInt(int64(m), 10)
 | 
			
		||||
					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")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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) {
 | 
			
		||||
	cpuReservation := ".0"
 | 
			
		||||
	memReservation := 0
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -92,7 +92,7 @@ func (s sdk) CheckRequirements(ctx context.Context, region string) error {
 | 
			
		|||
	if *serviceLongArnFormat != "enabled" {
 | 
			
		||||
		return fmt.Errorf("this tool requires the \"new ARN resource ID format\".\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
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
   Copyright 2020 Docker, Inc.
 | 
			
		||||
   Copyright 2020 Docker Compose CLI authors
 | 
			
		||||
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -107,7 +107,7 @@
 | 
			
		|||
        ],
 | 
			
		||||
        "NetworkConfiguration": {
 | 
			
		||||
          "AwsvpcConfiguration": {
 | 
			
		||||
            "AssignPublicIp": "DISABLED",
 | 
			
		||||
            "AssignPublicIp": "ENABLED",
 | 
			
		||||
            "SecurityGroups": [
 | 
			
		||||
              {
 | 
			
		||||
                "Ref": "TestSimpleConvertDefaultNetwork"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue