Skip to content

Commit d8fc41c

Browse files
committed
Remove RunTaskWithOverrides from ECS Client
1 parent a246189 commit d8fc41c

File tree

6 files changed

+202
-49
lines changed

6 files changed

+202
-49
lines changed

ecs-cli/modules/cli/compose/compose_app.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ func ProjectPs(p ecscompose.Project, c *cli.Context) {
8989
}
9090

9191
// ProjectRun starts containers and executes one-time command against the container
92+
// TODO These only account for command overrides within a ContainerOverride: https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ContainerOverride.html
9293
func ProjectRun(p ecscompose.Project, c *cli.Context) {
9394
args := c.Args()
9495
if len(args)%2 != 0 {

ecs-cli/modules/cli/compose/entity/task/task.go

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -164,21 +164,31 @@ func (t *Task) Scale(expectedCount int) error {
164164

165165
// Run starts all containers defined in the task definition once regardless of if they were started before
166166
// It also overrides the commands for the specified containers
167+
// TODO Account for other ContainerOverrides
167168
func (t *Task) Run(commandOverrides map[string][]string) error {
168169
taskDef, err := entity.GetOrCreateTaskDefinition(t)
169170
if err != nil {
170171
return err
171172
}
172173
taskDefinitionId := aws.StringValue(taskDef.TaskDefinitionArn)
173-
ecsTasks, err := t.Context().ECSClient.RunTaskWithOverrides(taskDefinitionId, entity.GetTaskGroup(t), 1, commandOverrides)
174+
count := 1
175+
176+
runTaskInput, err := t.buildRunTaskInput(taskDefinitionId, count, commandOverrides)
174177
if err != nil {
175-
return nil
178+
return err
179+
}
180+
181+
ecsTasks, err := t.Context().ECSClient.RunTask(runTaskInput)
182+
if err != nil {
183+
return err
176184
}
185+
177186
for _, failure := range ecsTasks.Failures {
178187
log.WithFields(log.Fields{
179188
"reason": aws.StringValue(failure.Reason),
180189
}).Info("Couldn't run containers")
181190
}
191+
182192
return t.waitForRunTasks(ecsTasks.Tasks)
183193
}
184194

@@ -242,15 +252,15 @@ func (t *Task) stopTasks(ecsTasks []*ecs.Task) error {
242252
// runTasks issues run task request to ECS Service in chunks of count=10
243253
func (t *Task) runTasks(taskDefinition string, totalCount int) ([]*ecs.Task, error) {
244254
result := []*ecs.Task{}
245-
chunkSize := 10 // can issue only upto 10 tasks in a RunTask Call
255+
chunkSize := 10 // can issue only up to 10 tasks in a RunTask Call
246256

247257
for i := 0; i < totalCount; i += chunkSize {
248258
count := chunkSize
249259
if i+chunkSize > totalCount {
250260
count = totalCount - i
251261
}
252262

253-
runTaskInput, err := t.buildRunTaskInput(taskDefinition, count)
263+
runTaskInput, err := t.buildRunTaskInput(taskDefinition, count, nil)
254264
if err != nil {
255265
return nil, err
256266
}
@@ -271,13 +281,35 @@ func (t *Task) runTasks(taskDefinition string, totalCount int) ([]*ecs.Task, err
271281
return result, nil
272282
}
273283

274-
func (t *Task) buildRunTaskInput(taskDefinition string, count int) (*ecs.RunTaskInput, error) {
284+
func convertToECSTaskOverride(overrides map[string][]string) (*ecs.TaskOverride, error) {
285+
if overrides == nil {
286+
return nil, nil
287+
}
288+
289+
commandOverrides := []*ecs.ContainerOverride{}
290+
for cont, command := range overrides {
291+
contOverride := &ecs.ContainerOverride{
292+
Name: aws.String(cont),
293+
Command: aws.StringSlice(command),
294+
}
295+
commandOverrides = append(commandOverrides, contOverride)
296+
}
297+
298+
ecsOverrides := &ecs.TaskOverride{
299+
ContainerOverrides: commandOverrides,
300+
}
301+
302+
return ecsOverrides, nil
303+
}
304+
305+
func (t *Task) buildRunTaskInput(taskDefinition string, count int, overrides map[string][]string) (*ecs.RunTaskInput, error) {
275306
cluster := t.Context().CommandConfig.Cluster
276307
launchType := t.Context().CommandConfig.LaunchType
277308
group := entity.GetTaskGroup(t)
278309

279310
ecsParams := t.ecsContext.ECSParams
280311
networkConfig, err := composeutils.ConvertToECSNetworkConfiguration(ecsParams)
312+
281313
if err != nil {
282314
return nil, err
283315
}
@@ -286,6 +318,11 @@ func (t *Task) buildRunTaskInput(taskDefinition string, count int) (*ecs.RunTask
286318
return nil, err
287319
}
288320

321+
taskOverride, err := convertToECSTaskOverride(overrides)
322+
if err != nil {
323+
return nil, err
324+
}
325+
289326
runTaskInput := &ecs.RunTaskInput{
290327
Cluster: aws.String(cluster),
291328
TaskDefinition: aws.String(taskDefinition),
@@ -297,6 +334,10 @@ func (t *Task) buildRunTaskInput(taskDefinition string, count int) (*ecs.RunTask
297334
runTaskInput.NetworkConfiguration = networkConfig
298335
}
299336

337+
if taskOverride != nil {
338+
runTaskInput.Overrides = taskOverride
339+
}
340+
300341
if launchType != "" {
301342
runTaskInput.LaunchType = aws.String(launchType)
302343
}

ecs-cli/modules/cli/compose/entity/task/task_test.go

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,3 +82,120 @@ func TestTaskInfoAll(t *testing.T) {
8282
}
8383

8484
// TODO: Test UP
85+
86+
// tests for helpers
87+
func TestConvertToECSTaskOverride(t *testing.T) {
88+
container := "railsapp"
89+
command := []string{"bundle exec puma -C config/puma.rb"}
90+
91+
input := map[string][]string{
92+
container: command,
93+
}
94+
95+
expected := &ecs.TaskOverride{
96+
ContainerOverrides: []*ecs.ContainerOverride{
97+
{
98+
Name: aws.String(container),
99+
Command: aws.StringSlice(command),
100+
},
101+
},
102+
}
103+
104+
actual, err := convertToECSTaskOverride(input)
105+
106+
if assert.NoError(t, err) {
107+
assert.Equal(t, expected, actual)
108+
}
109+
}
110+
111+
func TestConvertToECSTaskOverride_WithNil(t *testing.T) {
112+
var input map[string][]string
113+
114+
actual, err := convertToECSTaskOverride(input)
115+
116+
if assert.NoError(t, err) {
117+
assert.Nil(t, actual)
118+
}
119+
}
120+
121+
func TestBuildRuntaskInput(t *testing.T) {
122+
taskDef := "clydeApp"
123+
count := 1
124+
cluster := "myCluster"
125+
launchType := "EC2"
126+
127+
flagSet := flag.NewFlagSet("ecs-cli", 0)
128+
cliContext := cli.NewContext(nil, flagSet, nil)
129+
ctrl := gomock.NewController(t)
130+
mockEcs := mock_ecs.NewMockECSClient(ctrl)
131+
context := &context.ECSContext{
132+
ECSClient: mockEcs,
133+
CLIContext: cliContext,
134+
CommandConfig: &config.CommandConfig{
135+
Cluster: cluster,
136+
LaunchType: launchType,
137+
},
138+
}
139+
140+
task := &Task{
141+
ecsContext: context,
142+
}
143+
144+
req, err := task.buildRunTaskInput(taskDef, count, nil)
145+
146+
if assert.NoError(t, err) {
147+
assert.Equal(t, aws.String(cluster), req.Cluster)
148+
assert.Equal(t, aws.String(taskDef), req.TaskDefinition)
149+
assert.Equal(t, aws.String(launchType), req.LaunchType)
150+
assert.Equal(t, int64(count), aws.Int64Value(req.Count))
151+
assert.Nil(t, req.Overrides)
152+
}
153+
}
154+
155+
func TestBuildRuntaskInput_WithOverride(t *testing.T) {
156+
taskDef := "clydeApp"
157+
count := 1
158+
cluster := "myCluster"
159+
container := "railsapp"
160+
launchType := "EC2"
161+
command := []string{"bundle exec puma -C config/puma.rb"}
162+
override := map[string][]string{
163+
container: command,
164+
}
165+
166+
flagSet := flag.NewFlagSet("ecs-cli", 0)
167+
cliContext := cli.NewContext(nil, flagSet, nil)
168+
ctrl := gomock.NewController(t)
169+
mockEcs := mock_ecs.NewMockECSClient(ctrl)
170+
context := &context.ECSContext{
171+
ECSClient: mockEcs,
172+
CLIContext: cliContext,
173+
CommandConfig: &config.CommandConfig{
174+
Cluster: cluster,
175+
LaunchType: launchType,
176+
},
177+
}
178+
179+
task := &Task{
180+
ecsContext: context,
181+
}
182+
183+
expectedOverride := &ecs.TaskOverride{
184+
ContainerOverrides: []*ecs.ContainerOverride{
185+
{
186+
Name: aws.String("railsapp"),
187+
Command: aws.StringSlice(command),
188+
},
189+
},
190+
}
191+
192+
req, err := task.buildRunTaskInput(taskDef, count, override)
193+
194+
if assert.NoError(t, err) {
195+
assert.Equal(t, aws.String(cluster), req.Cluster)
196+
assert.Equal(t, aws.String(taskDef), req.TaskDefinition)
197+
assert.Equal(t, aws.String(launchType), req.LaunchType)
198+
assert.Equal(t, int64(count), aws.Int64Value(req.Count))
199+
assert.Equal(t, expectedOverride, req.Overrides)
200+
}
201+
}

ecs-cli/modules/clients/aws/ecs/client.go

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ type ECSClient interface {
5555
// Tasks related
5656
GetTasksPages(listTasksInput *ecs.ListTasksInput, fn ProcessTasksAction) error
5757
RunTask(runTaskInput *ecs.RunTaskInput) (*ecs.RunTaskOutput, error)
58-
RunTaskWithOverrides(taskDefinition, taskGroup string, count int, overrides map[string][]string) (*ecs.RunTaskOutput, error)
5958
StopTask(taskID string) error
6059
DescribeTasks(taskIds []*string) ([]*ecs.Task, error)
6160

@@ -380,36 +379,6 @@ func (c *ecsClient) RunTask(input *ecs.RunTaskInput) (*ecs.RunTaskOutput, error)
380379
return resp, err
381380
}
382381

383-
// RunTask issues a run task request for the input task definition
384-
func (c *ecsClient) RunTaskWithOverrides(taskDefinition, group string, count int, overrides map[string][]string) (*ecs.RunTaskOutput, error) {
385-
commandOverrides := []*ecs.ContainerOverride{}
386-
for cont, command := range overrides {
387-
contOverride := &ecs.ContainerOverride{
388-
Name: aws.String(cont),
389-
Command: aws.StringSlice(command),
390-
}
391-
commandOverrides = append(commandOverrides, contOverride)
392-
}
393-
ecsOverrides := &ecs.TaskOverride{
394-
ContainerOverrides: commandOverrides,
395-
}
396-
397-
resp, err := c.client.RunTask(&ecs.RunTaskInput{
398-
Cluster: aws.String(c.config.Cluster),
399-
TaskDefinition: aws.String(taskDefinition),
400-
Group: aws.String(group),
401-
Count: aws.Int64(int64(count)),
402-
Overrides: ecsOverrides,
403-
})
404-
if err != nil {
405-
log.WithFields(log.Fields{
406-
"task definition": taskDefinition,
407-
"error": err,
408-
}).Error("Error running tasks")
409-
}
410-
return resp, err
411-
}
412-
413382
func (c *ecsClient) StopTask(taskID string) error {
414383
_, err := c.client.StopTask(&ecs.StopTaskInput{
415384
Cluster: aws.String(c.config.Cluster),

ecs-cli/modules/clients/aws/ecs/client_test.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,44 @@ func TestRunTask(t *testing.T) {
459459
assert.NoError(t, err, "Unexpected error when calling RunTask")
460460
}
461461

462+
func TestRunTaskWithOverrides(t *testing.T) {
463+
mockEcs, _, client, ctrl := setupTestController(t, getDefaultCLIConfigParams(t))
464+
defer ctrl.Finish()
465+
466+
td := "taskDef"
467+
group := "taskGroup"
468+
count := 5
469+
containterOverride := &ecs.ContainerOverride{
470+
Name: aws.String("railsapp"),
471+
Command: aws.StringSlice([]string{"bundle,exec,puma,-C,config/puma.rb"}),
472+
}
473+
taskOverride := &ecs.TaskOverride{
474+
ContainerOverrides: []*ecs.ContainerOverride{containterOverride},
475+
}
476+
477+
mockEcs.EXPECT().RunTask(gomock.Any()).Do(func(input interface{}) {
478+
req := input.(*ecs.RunTaskInput)
479+
assert.Equal(t, clusterName, aws.StringValue(req.Cluster), "Expected clusterName to match")
480+
assert.Equal(t, td, aws.StringValue(req.TaskDefinition), "Expected taskDefinition to match")
481+
assert.Equal(t, group, aws.StringValue(req.Group), "Expected group to match")
482+
assert.Equal(t, taskOverride, req.Overrides, "Expected taskOverride to match")
483+
assert.Equal(t, int64(count), aws.Int64Value(req.Count), "Expected count to match")
484+
assert.Nil(t, req.NetworkConfiguration, "Expected Network Config to be nil.")
485+
assert.Nil(t, req.LaunchType, "Expected Launch Type to be nil.")
486+
}).Return(&ecs.RunTaskOutput{}, nil)
487+
488+
runTaskInput := &ecs.RunTaskInput{
489+
Cluster: aws.String(clusterName),
490+
TaskDefinition: aws.String(td),
491+
Group: aws.String(group),
492+
Count: aws.Int64(int64(count)),
493+
Overrides: taskOverride,
494+
}
495+
496+
_, err := client.RunTask(runTaskInput)
497+
assert.NoError(t, err, "Unexpected error when calling RunTask")
498+
}
499+
462500
func TestRunTaskWithLaunchTypeEC2(t *testing.T) {
463501
mockEcs, _, client, ctrl := setupTestController(t, getCLIConfigParamsWithLaunchType(t, "EC2"))
464502
defer ctrl.Finish()

ecs-cli/modules/clients/aws/ecs/mock/client.go

Lines changed: 0 additions & 13 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)