Skip to content
This repository was archived by the owner on Nov 19, 2025. It is now read-only.

Commit d696be9

Browse files
committed
Add GPU support to compose service
1 parent 252549f commit d696be9

File tree

3 files changed

+70
-1
lines changed

3 files changed

+70
-1
lines changed

ecs-cli/modules/utils/compose/convert_task_definition_test.go

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1807,6 +1807,41 @@ task_definition:
18071807
}
18081808
}
18091809

1810+
func TestConvertToTaskDefinitionWithECSParams_Gpu(t *testing.T) {
1811+
expectedGpuValue := "2"
1812+
content := `version: 1
1813+
task_definition:
1814+
services:
1815+
web:
1816+
gpu: ` + expectedGpuValue
1817+
ecsParams, err := createTempECSParamsForTest(t, content)
1818+
1819+
containerConfig := &adapter.ContainerConfig{
1820+
Name: "web",
1821+
Image: "wordpress",
1822+
}
1823+
containerConfigs := []adapter.ContainerConfig{*containerConfig}
1824+
taskDefinition, err := convertToTaskDefinitionForTest(t, containerConfigs, "", "", ecsParams, nil)
1825+
1826+
containerDefs := taskDefinition.ContainerDefinitions
1827+
web := findContainerByName("web", containerDefs)
1828+
1829+
resourceType := ecs.ResourceTypeGpu
1830+
expectedResourceRequirements := []*ecs.ResourceRequirement{
1831+
{
1832+
Type: &resourceType,
1833+
Value: &expectedGpuValue,
1834+
},
1835+
}
1836+
1837+
if assert.NoError(t, err) {
1838+
assert.ElementsMatch(t,
1839+
expectedResourceRequirements,
1840+
web.ResourceRequirements,
1841+
"Expected resourceRequirements to match")
1842+
}
1843+
}
1844+
18101845
///////////////////////
18111846
// helper functions //
18121847
//////////////////////
@@ -1842,3 +1877,23 @@ func findContainerByName(name string, containerDefs []*ecs.ContainerDefinition)
18421877
}
18431878
return nil
18441879
}
1880+
1881+
func createTempECSParamsForTest(t *testing.T, content string) (*ECSParams, error) {
1882+
b := []byte(content)
1883+
1884+
f, err := ioutil.TempFile("", "ecs-params")
1885+
assert.NoError(t, err, "Could not create ecs params tempfile")
1886+
1887+
defer os.Remove(f.Name())
1888+
1889+
_, err = f.Write(b)
1890+
assert.NoError(t, err, "Could not write data to ecs params tempfile")
1891+
1892+
err = f.Close()
1893+
assert.NoError(t, err, "Could not close tempfile")
1894+
1895+
ecsParamsFileName := f.Name()
1896+
ecsParams, err := ReadECSParams(ecsParamsFileName)
1897+
assert.NoError(t, err, "Could not read ECS Params file")
1898+
return ecsParams, err
1899+
}

ecs-cli/modules/utils/compose/ecs_params_reader.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ type ContainerDef struct {
6767
MemoryReservation libYaml.MemStringorInt `yaml:"mem_reservation"`
6868
HealthCheck *HealthCheck `yaml:"healthcheck"`
6969
Secrets []Secret `yaml:"secrets"`
70+
GPU string `yaml:"gpu"`
7071
}
7172

7273
type DockerVolume struct {

ecs-cli/modules/utils/compose/reconcile_container_def.go

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ package utils
1515

1616
import (
1717
"errors"
18-
1918
"github.com/aws/amazon-ecs-cli/ecs-cli/modules/cli/compose/adapter"
2019
"github.com/aws/aws-sdk-go/aws"
2120
"github.com/aws/aws-sdk-go/service/ecs"
@@ -96,6 +95,7 @@ func reconcileContainerDef(inputCfg *adapter.ContainerConfig, ecsConDef *Contain
9695
memLimit := inputCfg.Memory
9796
memRes := inputCfg.MemoryReservation
9897
healthCheck := inputCfg.HealthCheck
98+
var resourceRequirements []*ecs.ResourceRequirement
9999

100100
if ecsConDef != nil {
101101
outputContDef.Essential = aws.Bool(ecsConDef.Essential)
@@ -126,6 +126,15 @@ func reconcileContainerDef(inputCfg *adapter.ContainerConfig, ecsConDef *Contain
126126
if err != nil {
127127
return nil, err
128128
}
129+
130+
if ecsConDef.GPU != "" {
131+
resourceType := ecs.ResourceTypeGpu
132+
resourceRequirement := ecs.ResourceRequirement{
133+
Type: &resourceType,
134+
Value: &ecsConDef.GPU,
135+
}
136+
resourceRequirements = append(resourceRequirements, &resourceRequirement)
137+
}
129138
}
130139

131140
// At least one memory value is required to register a task definition.
@@ -153,5 +162,9 @@ func reconcileContainerDef(inputCfg *adapter.ContainerConfig, ecsConDef *Contain
153162
outputContDef.SetHealthCheck(healthCheck)
154163
}
155164

165+
if len(resourceRequirements) > 0 {
166+
outputContDef.SetResourceRequirements(resourceRequirements)
167+
}
168+
156169
return outputContDef, nil
157170
}

0 commit comments

Comments
 (0)