Skip to content

Commit ff2b846

Browse files
committed
Support task placement in RunTask
1 parent 13768d7 commit ff2b846

File tree

2 files changed

+67
-0
lines changed

2 files changed

+67
-0
lines changed

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,16 @@ func (t *Task) buildRunTaskInput(taskDefinition string, count int, overrides map
314314
return nil, err
315315
}
316316

317+
placementConstraints, err := composeutils.ConvertToECSPlacementConstraints(ecsParams)
318+
if err != nil {
319+
return nil, err
320+
}
321+
322+
placementStrategy, err := composeutils.ConvertToECSPlacementStrategy(ecsParams)
323+
if err != nil {
324+
return nil, err
325+
}
326+
317327
if err := entity.ValidateFargateParams(ecsParams, launchType); err != nil {
318328
return nil, err
319329
}
@@ -338,6 +348,15 @@ func (t *Task) buildRunTaskInput(taskDefinition string, count int, overrides map
338348
runTaskInput.Overrides = taskOverride
339349
}
340350

351+
if placementConstraints != nil {
352+
runTaskInput.PlacementConstraints = placementConstraints
353+
}
354+
355+
if placementStrategy != nil {
356+
runTaskInput.PlacementStrategy = placementStrategy
357+
}
358+
359+
341360
if launchType != "" {
342361
runTaskInput.LaunchType = aws.String(launchType)
343362
}

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

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -607,6 +607,54 @@ func TestRunTask_WithTaskNetworking(t *testing.T) {
607607
assert.NoError(t, err, "Unexpected error when calling RunTask")
608608
}
609609

610+
func TestRunTask_WithTaskPlacement(t *testing.T) {
611+
mockEcs, _, client, ctrl := setupTestController(t, getDefaultCLIConfigParams(t))
612+
defer ctrl.Finish()
613+
614+
td := "taskDef"
615+
group := "taskGroup"
616+
count := 5
617+
618+
placementConstraints := []*ecs.PlacementConstraint{
619+
{
620+
Type: aws.String("distinctInstance"),
621+
}, {
622+
Expression: aws.String("attribute:ecs.instance-type =~ t2.*"),
623+
Type: aws.String("memberOf"),
624+
},
625+
}
626+
placementStrategy := []*ecs.PlacementStrategy{
627+
{
628+
Type: aws.String("random"),
629+
}, {
630+
Field: aws.String("instanceId"),
631+
Type: aws.String("binpack"),
632+
},
633+
}
634+
635+
mockEcs.EXPECT().RunTask(gomock.Any()).Do(func(input interface{}) {
636+
req := input.(*ecs.RunTaskInput)
637+
assert.Equal(t, clusterName, aws.StringValue(req.Cluster), "Expected clusterName to match")
638+
assert.Equal(t, td, aws.StringValue(req.TaskDefinition), "Expected taskDefinition to match")
639+
assert.Equal(t, group, aws.StringValue(req.Group), "Expected group to match")
640+
assert.Equal(t, int64(count), aws.Int64Value(req.Count), "Expected count to match")
641+
assert.Equal(t, placementConstraints, req.PlacementConstraints, "Expected placement constraints to match")
642+
assert.Equal(t, placementStrategy, req.PlacementStrategy, "Expected placement strategy to match")
643+
}).Return(&ecs.RunTaskOutput{}, nil)
644+
645+
runTaskInput := &ecs.RunTaskInput{
646+
Cluster: aws.String(clusterName),
647+
TaskDefinition: aws.String(td),
648+
Group: aws.String(group),
649+
Count: aws.Int64(int64(count)),
650+
LaunchType: aws.String("EC2"),
651+
PlacementConstraints: placementConstraints,
652+
PlacementStrategy: placementStrategy,
653+
}
654+
_, err := client.RunTask(runTaskInput)
655+
assert.NoError(t, err, "Unexpected error when calling RunTask")
656+
}
657+
610658
func TestIsActiveCluster(t *testing.T) {
611659
mockEcs, _, client, ctrl := setupTestController(t, getDefaultCLIConfigParams(t))
612660
defer ctrl.Finish()

0 commit comments

Comments
 (0)